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

J’utilise souvent un opérateur de propagation nulle dans mon code, car cela me donne un code plus lisible, surtout dans les requêtes longues. Je n’ai pas besoin de vérifier toutes les classes utilisées.

Le code suivant génère une erreur de compilation que 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 peut ne pas contenir d’opérateur de propagation nul.

C # Peut facilement traduire le code ci-dessus dans le code en suivant le code 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 jette simplement une erreur de compilation?

C’est compliqué car les expressions lambdas (contrairement aux delegates lambdas) sont interprétées par des fournisseurs LINQ déjà existants qui ne prennent pas encore en charge la propagation nulle.

La conversion en 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 approfondir la discussion sur CodePlex où 3 solutions sont proposées: NullPropagationExpression , ConditionalExpression et un hybride