usar una tipo sintaxis puede funciones expresión expresiones expresion delegado cómo convertir consulta anonimas c# .net compiler-errors c#-6.0 null-propagation-operator

c# - una - ¿Por qué no puedo usar el operador de propagación nulo en expresiones lambda?



no se puede convertir expresion lambda en el tipo delegado (1)

A menudo utilizo un operador de propagación nulo en mi código porque me da un código más legible, especialmente en consultas largas, no tengo que verificar nulamente cada clase que se usa.

El siguiente código arroja un error de compilación que no podemos usar como operador de propagación nulo en lambda.

var cnt = humans.AsQueryable().Count(a => a.House?[0].Price == 5000);

El error :

Error CS8072 Un árbol de expresión lambda no puede contener un operador de propagación nulo.

¡C # podría traducir fácilmente el código anterior al código al siguiente código si realmente no puede hacer nada más!

var cnt = humans.AsQueryable().Count(a => a.House != null && a.House[0].Price == 5000);

Tengo curiosidad por qué C # no hace nada y simplemente arroja un error de compilación.


Es complicado ya que el árbol de expresión lambdas (a diferencia del delegado lambdas) es interpretado por proveedores LINQ ya existentes que aún no admiten propagación nula.

La conversión a una expresión condicional no siempre es precisa, ya que hay múltiples evaluaciones con ?. solo hay una evaluación por ejemplo:

customer.Where(a => c.Increment()?.Name) // Written by the user customer.Where(a => c.Increment() == null ? null : c.Increment().Name) // Incorrectly interpreted by an old LINQ provider

Puede profundizar en la discusión relevante sobre CodePlex donde se ofrecen 3 soluciones: NullPropagationExpression , ConditionalExpression y un híbrido