Ich verwende oft Null propagierenden Operator in meinem Code, weil es mir mehr lesbaren Code gibt, speziell in langen Abfragen muss ich nicht jede einzelne Klasse, die verwendet wird, Null-überprüfen.Warum kann ich den Null-Propagierungsoperator nicht in Lambda-Ausdrücken verwenden?
Der folgende Code löst einen Kompilierungsfehler aus, bei dem wir in lambda keinen null-propagierenden Operator verwenden können.
var cnt = humans.AsQueryable().Count(a => a.House?[0].Price == 5000);
Der Fehler:
Fehler CS8072 Ein Ausdruck Baum Lambda kann kein Null ausbreitende Operator enthalten.
C# Könnte den obigen Code leicht in den Code zum 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 neugierig, warum C# nichts tut und einfach wirft ein Compiler-Fehler?
'Foo? .Bar' ist nicht äquivalent zu' Foo! = Null? Foo.Bar: null, weil 'Foo' einmal mit dem Null-propagierenden Operator und zweimal mit dem Conditional ausgewertet wird, sodass die Übersetzung nicht in allen Fällen korrekt wäre. –
Beachten Sie, dass es bei seinem Code für EF die Möglichkeit gibt, dass Sie den proprietären Nulloperator nicht wirklich benötigen, denn wenn eine Abfrage in einen SQL-Aufruf konvertiert wird, wirft SQL keine Nullen :-) – xanatos
** NB: * * Es wäre auch nützlich, 'var q = von c in Kategorien zu schreiben join p in Produkte auf c gleich p.Kategorie in ps von p in ps.DefaultIfEmpty() wähle new {Category = c, ProductName = (p? .ProductName) ?? "(No products)"}; 'anstatt,' ProductName = (p == null) schreiben zu müssen? "(No products)": p.ProductName', weil EF den '? .' - Operator derzeit nicht unterstützt. – Matt