valores - nullable c#
¿Cómo puedo devolver NULL desde un método genérico en C#? (11)
Si tiene objeto, entonces necesita encasillar
return (T)(object)(employee);
Si necesita devolver nulo.
return default(T);
Tengo un método genérico con este código (ficticio) (sí, sé que IList tiene predicados, pero mi código no usa IList, pero alguna otra colección, de todas formas esto es irrelevante para la pregunta ...
static T FindThing<T>(IList collection, int id) where T : IThing, new()
{
foreach T thing in collecion
{
if (thing.Id == id)
return thing;
}
return null; // ERROR: Cannot convert null to type parameter ''T'' because it could be a value type. Consider using ''default(T)'' instead.
}
Esto me da un error de compilación
"No se puede convertir nulo al tipo de parámetro ''T'' porque podría ser un tipo de valor. Considere usar ''default (T)'' en su lugar".
¿Puedo evitar este error?
A continuación se muestran las dos opciones que puede utilizar
return default(T);
o
where T : class, IThing
return null;
Agregue la restricción de clase como la primera restricción a su tipo genérico.
static T FindThing<T>(IList collection, int id) where T : class, IThing, new()
Aquí hay un ejemplo de trabajo para los valores de retorno de Nullable Enum:
public static TEnum? ParseOptional<TEnum>(this string value) where TEnum : struct
{
return value == null ? (TEnum?)null : (TEnum) Enum.Parse(typeof(TEnum), value);
}
Dos opciones:
- Devuelve el
default(T)
que significa que devolveránull
si T es un tipo de referencia (o un tipo de valor anulable),0
paraint
,''/0''
parachar
, etc. - Restrinja T para que sea un tipo de referencia con la restricción de
where T : class
y luego devuelvanull
como normal
La solución de TheSoftwareJedi funciona,
también puede archivarlo con el uso de tipos de valores y valores anulables:
static T? FindThing<T>(IList collection, int id) where T : struct, IThing
{
foreach T thing in collecion
{
if (thing.Id == id)
return thing;
}
return null;
}
Otra alternativa a 2 respuestas presentadas anteriormente. Si cambia su tipo de retorno a object
, puede devolver null
, mientras que al mismo tiempo emitir el retorno no nulo.
static object FindThing<T>(IList collection, int id)
{
foreach T thing in collecion
{
if (thing.Id == id)
return (T) thing;
}
return null; // allowed now
}
Solo puedes ajustar tus restricciones:
where T : class
Luego se permite devolver el nulo.
Su otra opción sería agregar esto al final de su declaración:
where T : class
where T: IList
De esa forma te permitirá volver nulo.
Tome la recomendación del error ... y el usuario default(T)
o new T
Tendrá que agregar una comparación en su código para asegurarse de que fue una coincidencia válida si va por esa ruta.
De lo contrario, potencialmente considere un parámetro de salida para "coincidencia encontrada".
return default(T);