Ich verwende häufig einen Null-Propagierungsoperator in meinem Code, 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, für den in Lambda kein Null-Propagierungsoperator 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 # Könnte den obigen Code leicht in den Code in den 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 tut und einfach einen Compilerfehler auslöst.
c#
.net
compiler-errors
c#-6.0
null-propagation-operator
Mohsen Sarkar
quelle
quelle
Foo?.Bar
ist nicht gleichbedeutend mit,Foo != null ? Foo.Bar : null
daFoo
einmal mit dem sich null ausbreitenden Operator und zweimal mit der Bedingung ausgewertet wird, sodass die Übersetzung nicht in allen Fällen korrekt wäre.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)"};
anstatt schreiben zu müssen,ProductName = (p == null) ? "(No products)" : p.ProductName
da EF den?.
Operator derzeit nicht unterstützt .Antworten:
Dies ist kompliziert, da Ausdrucksbaum-Lambdas (im Gegensatz zu delegierten Lambdas) von bereits vorhandenen LINQ-Anbietern interpretiert werden, die die Null-Weitergabe noch nicht unterstützen.
Die Konvertierung in einen bedingten Ausdruck ist nicht immer korrekt, da mehrere Auswertungen vorliegen, während
?.
nur eine einzige Auswertung vorliegt, zum Beispiel:Sie können in der jeweiligen tiefe Diskussion auf CodePlex , wo drei Lösungen angeboten:
NullPropagationExpression
,ConditionalExpression
& a hybridquelle
Expression
ist in der Lage sein , alle Ausdrücke C # semantisch als Code darzustellen. Es ist nicht nur eine kleine Teilmenge der Sprache.