es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Tipo anulable generando advertencias ya que el proyecto ha habilitado tipos de referencia anulables.

Solo obtengo las advertencias después de habilitar los tipos de referencia anulables, pero el ejemplo específico es en realidad el buen y viejo tipo Nullable<T>:

var nullableItems = new List<int?>();

var actualNonNullValues = nullableItems.Where(x => x.HasValue)
                                       .Select(x => x.Value)
                                       .ToList();

Entonces, descarto todos los nulos y solo quiero los elementos reales que no son nulos. Sin embargo, la parte .Select(x => x.Value) me dará una advertencia del compilador sobre x que puede ser nulo aquí. Lógicamente, no lo es, pero para el compilador, el tipo aún no ha cambiado y sigue siendo un int?.

Sé que puedo decirle al compilador que se calle simplemente aplicando un ! al x, pero parece que hice trampa. En otros lenguajes que uso, tener que recurrir a esto se considera una mala práctica y significa que hiciste algo mal.

¿Cuáles son mis otras opciones? ¿Puedo hacer mejor que solo usar un ! aquí?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en c#, nullable y nullable-reference-types, tiene otras opciones para manejar la advertencia del compilador sobre x posiblemente siendo nulo en la parte del código .Select(x => x.Value). Una opción es usar el operador de olvido de nulo (!) después de Value, así: .Select(x => x!.Value).ToList(). Sin embargo, esta solución puede no ser ideal porque esencialmente está diciéndole al compilador que ignore los tipos de referencia nulos y asuma que x no es nulo, lo que puede llevar a errores en tiempo de ejecución si x es nulo en realidad.

    Una opción mejor es usar el operador de coalescencia nula (??) para proporcionar un valor predeterminado si x es nullo, así: .Select(x => x.HasValue ? x.Value : defaultValue).ToList(). Aquí, defaultValue puede ser cualquier valor que elija para representar nulo. Esta solución es más segura porque tiene en cuenta la posibilidad de que x sea nulo y proporciona un valor de respaldo para evitar errores en tiempo de ejecución.

    Otra opción es usar el método de extensión WhereNotNull del espacio de nombres System.Linq, así: var actualNonNullValues = nullableItems.WhereNotNull().ToList(). Este método de extensión filtra todos los valores nulos y devuelve solo los valores no nulos, eliminando la necesidad de la parte del código .Where(x => x.HasValue). Esta solución es concisa y legible, y hace que su intención sea más clara.

    En resumen, como experto en TI especializado en c#, nullable y nullable-reference-types, tiene varias opciones para manejar la advertencia del compilador sobre x posiblemente siendo nulo. Puede usar el operador de olvido de nulo, el operador de coalescencia nula o el método de extensión WhereNotNull para asegurarse de que su código sea seguro y legible.

Comments are closed.