web-dev-qa-db-de.com

Warum kann ich den Null-Propagierungsoperator nicht in Lambda-Ausdrücken verwenden?

Ich verwende in meinem Code oft einen Null-Propagierungsoperator, weil er mir besser lesbaren Code bietet, insbesondere bei langen Abfragen, bei denen ich nicht jede einzelne verwendete Klasse auf Null prüfen muss.

Der folgende Code löst einen Kompilierungsfehler aus, bei dem der Null-Propagierungsoperator in Lambda nicht verwendet werden kann.

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

Der Fehler :

Fehler CS8072 Ein Ausdrucksbaum-Lambda enthält möglicherweise keinen Null-Propagierungsoperator.

C # Konnte den obigen Code leicht in folgenden Code übersetzen, wenn wirklich nichts anderes möglich ist!

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

Ich bin gespannt, warum C # nichts macht und einfach einen Compilerfehler auslöst.

93
Mohsen Sarkar

Es ist kompliziert, da Ausdrucksbaum-Lambdas (im Gegensatz zu Delegate-Lambdas) von bereits vorhandenen LINQ-Providern interpretiert werden, die noch keine Null-Propagierung unterstützen.

Das Konvertieren in einen bedingten Ausdruck ist nicht immer korrekt, da mehrere Auswertungen vorliegen, während es mit ?. Nur eine einzige Auswertung gibt, zum Beispiel:

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

Sie können tiefer in die relevanten Diskussion über CodePlex gehen, wo 3 Lösungen angeboten werden: NullPropagationExpression, ConditionalExpression & ein Hybrid

62
i3arnon