visual valores valor validar tipo tener solo que puede objeto nulo lectura debe convertir codigos acepta c# generics

valores - nullable c#



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

  1. Si tiene objeto, entonces necesita encasillar

    return (T)(object)(employee);

  2. 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 para int , ''/0'' para char , etc.
  • Restrinja T para que sea un tipo de referencia con la restricción de where T : class y luego devuelva null 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);