¿Cómo puedo devolver NULL desde un método genérico en C#?

Resuelto edosoft asked hace 16 años • 13 respuestas

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?

edosoft avatar Nov 19 '08 21:11 edosoft
Aceptado

Tres opciones:

  • Devolución default(o default(T)para versiones anteriores de C#), lo que significa que devolverá nullsi Tes un tipo de referencia (o un tipo de valor que acepta valores NULL), 0para int, '\0'para char, etc. ( tabla de valores predeterminados (referencia de C#) )
  • Si está contento de restringirlo Tpara que sea un tipo de referencia con la where T : classrestricción y luego regresar nullnormalmente
  • Si está dispuesto a restringirlo Tpara que sea un tipo de valor que no admite valores NULL con la where T : structrestricción, nuevamente puede regresar nullnormalmente desde un método con un valor de retorno de T?; tenga en cuenta que esto no devuelve una referencia nula, sino el valor nulo de el tipo de valor que acepta valores NULL.
Jon Skeet avatar Nov 19 '2008 14:11 Jon Skeet
return default(T);
 avatar Nov 19 '2008 14:11

Puedes simplemente ajustar tus restricciones:

where T : class

Entonces se permite devolver nulo.

TheSoftwareJedi avatar Nov 19 '2008 15:11 TheSoftwareJedi