A menudo uso 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 cada clase que se usa.
El siguiente código arroja un error de compilación que no podemos usar un operador de propagación nulo en lambda.
var cnt = humans.AsQueryable().Count(a => a.House?[0].Price == 5000);
El error :
Error CS8072 Una lambda de árbol de expresión no puede contener un operador de propagación nulo.
C # ¡Podría traducir fácilmente el código anterior al código siguiente 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 saber por qué C # no hace nada y simplemente arroja un error del compilador.
c#
.net
compiler-errors
c#-6.0
null-propagation-operator
Mohsen Sarkar
fuente
fuente
Foo?.Bar
no es equivalente aFoo != null ? Foo.Bar : null
porqueFoo
se evalúa una vez con el operador de propagación nula y dos veces con el condicional, por lo que la traducción no sería correcta en todos los casos.var q = from c in Categories join p in Products on c equals p.Category into ps from p in ps.DefaultIfEmpty() select new { Category = c, ProductName = (p?.ProductName)??"(No products)"};
lugar de tener que escribirProductName = (p == null) ? "(No products)" : p.ProductName
porque EF actualmente no admite el?.
operador.Respuestas:
Es complicado ya que las lambdas del árbol de expresión (a diferencia de las lambdas delegadas) son interpretadas por proveedores LINQ ya existentes que aún no admiten la propagación nula.
La conversión a una expresión condicional no siempre es precisa, ya que hay varias evaluaciones, mientras que con
?.
solo hay una única evaluación, por ejemplo:Usted puede ir más profundo en el correspondiente debate en CodePlex , donde hay 3 soluciones:
NullPropagationExpression
,ConditionalExpression
y un híbridofuente
Expression
es poder representar todas las expresiones de C # semánticamente como código. No está diseñado para ser solo un pequeño subconjunto del lenguaje.