Ja, tut es. Wie immer ist die C # -Sprachspezifikation die definitive Quelle 1 .
Aus der C # 3 Spezifikation, Abschnitt 7.12 (v3 statt 4, da die v4 Spezifikation in dynamische Details geht, die hier nicht wirklich relevant sind):
Der Typ des Ausdrucks
a ?? b
hängt davon ab, welche impliziten Konvertierungen zwischen den Typen der Operanden verfügbar sind. In der Reihenfolge der Präferenz, der Typ von a ?? b ist A0, A oder B, wobei A der Typ von a ist, B der Typ von b ist (vorausgesetzt, dass b einen Typ hat) und A0 der zugrundeliegende Typ von A ist, wenn A ein nullbarer Typ oder sonst A ist . Insbesondere wirda ?? b
als verarbeitet folgt:
- Wenn A kein Nullable-Typ oder Referenztyp ist, wird ein Fehler bei der Kompilierung angezeigt tritt auf.
- Wenn A ein Nullable-Typ ist und eine implizite Konvertierung von b nach A0, der Ergebnistyp ist A0. Beim Laufzeit, a wird zuerst ausgewertet. Wenn ein ist nicht null, a wird zum Eingeben ausgepackt A0, und das wird das Ergebnis. Ansonsten wird b ausgewertet und konvertiert in Typ A0, und dies wird das Ergebnis.
- Andernfalls, wenn eine implizite Konvertierung von b nach A existiert, ist der Ergebnistyp A. Zur Laufzeit wird a zuerst ausgewertet. Wenn a nicht null ist, wird a zum Ergebnis. Ansonsten wird b ausgewertet und konvertiert zu Typ A, und dies wird das Ergebnis.
- Andernfalls, wenn b einen Typ B hat und eine implizite Konvertierung von A0 nach B, der Ergebnistyp ist B. Zur Laufzeit a wird zuerst ausgewertet. Wenn a nicht ist null, a wird zum Eingeben von A0 ausgepackt (außer A und A0 sind gleich) und konvertiert zu Typ B, und dies wird zum Ergebnis. Ansonsten ist b ausgewertet und wird das Ergebnis.
- Andernfalls sind a und b nicht kompatibel und es tritt ein Kompilierungsfehler auf.
Das zweite, dritte und vierte Geschoss sind die relevanten.
1 Es gibt eine philosophische Diskussion darüber, ob der Compiler, den Sie gerade benutzen, die tatsächliche Quelle der Wahrheit ist ... ist die Wahrheit über eine Sprache was es ist gemeint zu tun oder was es gerade macht ?
Tags und Links c# logic operator-keyword