web-dev-qa-db-fra.com

Pourquoi ne puis-je pas utiliser l'opérateur de propagation null dans les expressions lambda?

J'utilise souvent un opérateur de propagation null dans mon code car il me donne un code plus lisible, en particulier dans les longues requêtes, je n'ai pas à vérifier de manière nulle 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 null dans lambda.

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

L'erreur :

Erreur CS8072 Un arbre d'expression lambda ne peut pas contenir un 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 génère simplement une erreur du compilateur?

93
Mohsen Sarkar

C'est compliqué car l'expression lambdas de l'arbre d'expression (contrairement à délégué lambdas) est interprétée par les fournisseurs LINQ déjà existants qui ne prennent pas encore en charge la propagation nulle.

La conversion en une expression conditionnelle n’est pas toujours précise, car il existe plusieurs évaluations avec ?. il n'y a qu'une seule évaluation par exemple:

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

Vous pouvez aller plus loin dans le pertinent discussion sur CodePlex où 3 solutions sont proposées: NullPropagationExpression, ConditionalExpression & un hybride

62
i3arnon