Ein kleines Problem. Irgendeine Idee Leute, warum das nicht funktioniert?
%Vor% Ich versuche null
zurückzugeben, wenn der linke Ausdruck True ist, sonst 1
. Scheint einfach, aber gibt einen Kompilierungsfehler.
Der Typ des Bedingungsausdrucks kann nicht bestimmt werden, da es keine implizite Konvertierung zwischen null
und int
gibt.
Wenn ich das null
in ? null : 1
durch irgendein gültiges int
ersetze, dann gibt es kein Problem.
Ja - der Compiler kann keinen passenden Typ für den bedingten Ausdruck finden. Ignoriere die Tatsache, dass du es einem int?
zuordnest - der Compiler benutzt diese Information nicht. Also der Ausdruck ist:
Was ist der Typ dieses Ausdrucks? Die Sprachspezifikation besagt, dass es entweder der Typ des zweiten Operanden oder der des dritten Operanden sein muss. null
hat keinen Typ, also müsste es int
(der Typ des dritten Operanden) sein - aber es gibt keine Konvertierung von null
nach int
, also scheitert es.
Wirf einen der Operanden auf int?
und es wird funktionieren, oder benutze einen anderen Weg, um den Nullwert auszugeben - also irgendwas davon:
Ich stimme zu, es ist ein leichter Schmerz, dass Sie das tun müssen.
Aus dem C # 3.0-Sprachspezifikationsabschnitt 7.13:
Der zweite und dritte Operand des ?: operator steuert den Typ des bedingter Ausdruck. Lass X und Y sein die Arten der zweiten und dritten Operanden. Dann,
Wenn X und Y vom selben Typ sind, dann ist dies der Typ der Bedingung Ausdruck.
Andernfalls, wenn eine implizite Konvertierung (§ 6.1) von X nach Y existiert, aber nicht von Y bis X, dann ist Y der Typ der bedingter Ausdruck.
Andernfalls, wenn eine implizite Konvertierung (§ 6.1) von Y nach X existiert, aber nicht von X nach Y, dann ist X die Art der bedingter Ausdruck.
Andernfalls kann kein Ausdruckstyp und ein Fehler bei der Kompilierung festgestellt werden tritt auf.
Das funktioniert: int? nullableIntVal = (this.Policy == null) ? null : (int?)1;
.
Grund (vom Kommentar kopiert):
Die Fehlermeldung besteht darin, dass die beiden Zweige des ?:
-Operators ( null
und 1
) keinen kompatiblen Typ haben. Die Zweige der neuen Lösung (mit null
und (int?)1
) tun dies.
Tags und Links c# nullable conditional-operator