¿Cómo puedo devolver NULL desde un método genérico en C#?
Tengo un método genérico con este código (ficticio) (sí, sé que IList tiene predicados, pero mi código no usa IList sino alguna otra colección; de todos modos, esto es irrelevante para la pregunta...)
static T FindThing<T>(IList collection, int id) where T : IThing, new()
{
foreach (T thing in collection)
{
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 parámetro de tipo 'T' porque podría ser un tipo de valor. Considere usar 'predeterminado(T)' en su lugar".
¿Puedo evitar este error?
Aceptado
Tres opciones:
- Devolución
default
(odefault(T)
para versiones anteriores de C#), lo que significa que devolveránull
siT
es un tipo de referencia (o un tipo de valor que acepta valores NULL),0
paraint
,'\0'
parachar
, etc. ( tabla de valores predeterminados (referencia de C#) ) - Si está contento de restringirlo
T
para que sea un tipo de referencia con lawhere T : class
restricción y luego regresarnull
normalmente - Si está dispuesto a restringirlo
T
para que sea un tipo de valor que no admite valores NULL con lawhere T : struct
restricción, nuevamente puede regresarnull
normalmente desde un método con un valor de retorno deT?
; tenga en cuenta que esto no devuelve una referencia nula, sino el valor nulo de el tipo de valor que acepta valores NULL.
return default(T);
Puedes simplemente ajustar tus restricciones:
where T : class
Entonces se permite devolver nulo.