Costumo usar o operador de propagação nulo em meu código porque ele me dá um código mais legível, especialmente em consultas longas, não preciso verificar o valor nulo de todas as classes usadas.
O código a seguir lança um erro de compilação de que não podemos usar o operador de propagação nulo em lambda.
var cnt = humans.AsQueryable().Count(a => a.House?[0].Price == 5000);
O erro :
Erro CS8072 Um lambda de árvore de expressão não pode conter um operador de propagação nulo.
C # poderia facilmente traduzir o código acima para o código a seguir se realmente não puder fazer mais nada!
var cnt = humans.AsQueryable().Count(a => a.House != null && a.House[0].Price == 5000);
Estou curioso para saber por que o C # não faz nada e simplesmente lança um erro do compilador?
c#
.net
compiler-errors
c#-6.0
null-propagation-operator
Mohsen Sarkar
fonte
fonte
Foo?.Bar
não é equivalente aFoo != null ? Foo.Bar : null
porqueFoo
é avaliado uma vez com o operador de propagação nula e duas vezes com o condicional, de modo que a tradução não seria correta em todos os 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)"};
vez de ter que escreverProductName = (p == null) ? "(No products)" : p.ProductName
porque EF atualmente não suporta o?.
operador.Respostas:
É complicado, pois os lambdas da árvore de expressão (ao contrário dos lambdas do delegado) são interpretados por provedores LINQ já existentes que ainda não oferecem suporte à propagação nula.
A conversão para uma expressão condicional nem sempre é precisa, pois há várias avaliações, enquanto com
?.
há apenas uma única avaliação, por exemplo:Você pode ir mais fundo na relevante discussão no CodePlex , onde são oferecidos 3 soluções:
NullPropagationExpression
,ConditionalExpression
e um híbridofonte
Expression
se ser capaz de representar todas as expressões C # semanticamente como código. Não foi projetado para ser apenas um pequeno subconjunto da linguagem.