Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

333
Vistas
Cómo evitar obtener una "posible asignación" nula "a una entidad no anulable"

Lo siento por este ejemplo incómodo, pero quiero mantenerlo lo más directo posible.

Digamos que analicé un archivo json, lo que me da la jerarquía a continuación

 var customers = myObj.SubObj?.CustomerList.EmptyIfNull(); var plusCustomers = customers.Where(...) // Resharper warning

myobj no puede ser nulo SubObject puede ser nulo a veces

Tengo un método de extensión

 IEnumerable<T> EmptyIfNull<T>(this IEnumerable<T> enumerable) => enumerable ?? Enumerable.Empty<T>();

Así que espero que la línea plusCustomers sea segura (lista vacía en lugar de nula). Pero recibo una advertencia

posible asignación "nula" a una entidad no anulable

Si reemplazo la primera línea con

 var customers = myObj.SubObj.CustomerList.EmptyIfNull();

Me deshago de la advertencia, pero eso no es correcto. ¿Cómo puedo convencer a Resharper de que esto está bien?... o me equivoco?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Puede agregar paréntesis:

 (myObj.SubObj?.CustomerList).EmptyIfNull();

El efecto del encadenamiento nulo ( ?. ) es evaluar toda la cadena de accesos de miembros a nulo, si el operando LHS es nulo, en lugar de evaluar solo ese acceso de miembro único a nulo. Por ejemplo, considere una larga cadena de accesos de miembros abcdef . Si solo a es anulable, solo necesitaría escribir ? después de a para que esto sea seguro. No solo evalúa a?.b como nulo si a es nulo, porque en ese caso tendría que escribir ? después de cada acceso de miembro para que esto sea seguro, y eso es un poco molesto.

Entonces, sin los corchetes, todo el acceso del miembro se anula debido a ?. , independientemente de cómo se llame al final.

Al agregar corchetes, rompe la cadena de accesos de los miembros, de modo que myObj.SubObj?.CustomerList sea de un tipo anulable, y llamar a EmptyIfNull en eso funciona como se esperaba, devolviendo cualquier tipo que EmptyIfNull deba devolver.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda