Im Allgemeinen, wenn der bedingten Operator, hier ist die Syntax:Wie kann ich einen Func <> bedingt zwischen lambdas mit dem bedingten ternären Operator zuweisen?
int x = 6;
int y = x == 6 ? 5 : 9;
Nichts Besonderes, ziemlich geradlinig.
Versuchen wir nun, dies zu verwenden, wenn Sie einem Func-Typ ein Lambda zuweisen. Lassen Sie mich erklären:
Func<Order, bool> predicate = id == null
? p => p.EmployeeID == null
: p => p.EmployeeID == id;
Das ist die gleiche Syntax ist, und sollte Arbeit? Recht? Aus irgendeinem Grund nicht. Der Compiler gibt diese schöne kryptische Nachricht:
Fehler 1 Art des bedingten Ausdrucks nicht bestimmt werden kann, weil es keine implizite Konvertierung zwischen ‚Lambda-Ausdruck‘ ist und ‚Lambda-Ausdruck‘
Ich ging dann weiter und die Syntax geändert und auf diese Weise es Arbeit tat
Func<Order, bool> predicate = id == null
? predicate = p => p.EmployeeID == null
: predicate = p => p.EmployeeID == id;
ich nur neugierig bin, warum es nicht die erste Art und Weise arbeiten?
(Randbemerkung: Ich landete den Code nicht benötigen, wie ich das herausgefunden, wenn ein int Wert gegen null zu vergleichen, die Sie gerade object.Equals verwenden)
Ich frage mich, wenn der Compiler dies ableiten kann: 'Func Prädikat = p => p.EmployeeID == id', wie kommt es Schwierigkeiten hat Folgern dieses:' Func Prädikat = id == null ? (Func ) (p => p.EmployeeID == null) : p => p.EmployeeID == id; '? Ich meine, es kennt den Typ, der für den zweiten und dritten Operanden benötigt wird, über die Deklaration des Prädikats. –
GDS
@ GDS: Es gibt eine implizite Konvertierung vom Lambda-Ausdruck in den Delegate-Typ, weshalb die erste Version funktioniert. Die Deklaration von "Prädikat" hat jedoch keinen Einfluss auf die Typinferenz für den bedingten Ausdruck. Die Sprachspezifikation besagt grundsätzlich, dass der Typ des Bedingungsausdrucks nur über die Operanden ableitbar sein muss. –
Dann frage ich mich, warum der ternäre Operator eine solche Anforderung hätte. Es ist nur eine bedingte Zuweisung des zweiten oder dritten Operanden zu einer Variablen oder eine bedingte Auswertung eines Ausdrucks. Sofern ich etwas nicht verpasse, sollte jede Schlussfolgerung, die mit einer direkten Zuweisung oder Bewertung erzielt wird, auch mit der bedingten Zuweisung oder Bewertung plausibel sein. Wenn ein Operant mehrdeutig ist, könnte die Schlussfolgerung des anderen die Mehrdeutigkeit potenziell auflösen. Wenn Mehrdeutigkeit nicht aufgelöst werden kann, kann der Compiler wie im obigen Beispiel immer noch beschweren. Vielleicht ein ausgelassenes Feature ...? – GDS