J'utilise souvent un opérateur de propagation nul dans mon code car il me donne un code plus lisible, en particulier dans les requêtes longues, je n'ai pas à vérifier la valeur nulle de chaque classe utilisée.
Le code suivant lève une erreur de compilation selon laquelle nous ne pouvons pas utiliser l'opérateur de propagation nul dans lambda.
var cnt = humans.AsQueryable().Count(a => a.House?[0].Price == 5000);
L'erreur :
Erreur CS8072 Une arborescence d'expression lambda ne peut pas contenir d'opérateur de propagation nul.
C # pourrait facilement traduire le code ci-dessus en code en code suivant s'il ne peut vraiment rien faire d'autre!
var cnt = humans.AsQueryable().Count(a => a.House != null && a.House[0].Price == 5000);
Je suis curieux de savoir pourquoi C # ne fait rien et lève simplement une erreur de compilation?
c#
.net
compiler-errors
c#-6.0
null-propagation-operator
Mohsen Sarkar
la source
la source
Foo?.Bar
n'est pas équivalent àFoo != null ? Foo.Bar : null
carFoo
est évalué une fois avec l'opérateur de propagation nul et deux fois avec le conditionnel, de sorte que la traduction ne serait pas correcte dans tous les cas.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)"};
au lieu d'avoir à écrireProductName = (p == null) ? "(No products)" : p.ProductName
car EF ne prend actuellement pas en charge l'?.
opérateur.Réponses:
C'est compliqué car les lambdas d'arbre d'expression (contrairement aux lambdas de délégué) sont interprétés par des fournisseurs LINQ déjà existants qui ne prennent pas encore en charge la propagation null.
La conversion en une expression conditionnelle n'est pas toujours précise car il y a plusieurs évaluations alors qu'avec
?.
une seule évaluation, par exemple:Vous pouvez aller plus loin dans la pertinente discussion sur CodePlex où 3 solutions sont proposées:
NullPropagationExpression
,ConditionalExpression
et un hybridela source
Expression
est de pouvoir représenter toutes les expressions C # sémantiquement sous forme de code. Il n'est pas conçu pour être juste un petit sous-ensemble du langage.