c# ternärer Operator und nullable Ganzzahlen: Warum ? 10 : null
fällt
Der C# ternäre Operator (condition ? value1 : value2
) erfordert, dass sowohl value1
als auch value2
kompatible Typen haben. Lassen Sie uns untersuchen, warum der folgende Code einen Compiler -Fehler erzeugt:
<code class="language-csharp">int? x = GetBoolValue() ? 10 : null; </code>
Die Fehlermeldung "Art des bedingten Ausdrucks kann nicht bestimmt werden, da keine implizite Konvertierung zwischen 'int' und '10
als int
und null
als null
(was in diesem Zusammenhang das Fehlen eines Wertes darstellt). Da es keine automatische Umwandlung zwischen einem int
und einem Nullwert gibt, kann der Compiler nicht auf den resultierenden Typ des ternären Ausdrucks schließen.
Lösungen:
Um dies zu beheben, müssen wir die Konsistenz des Typs sicherstellen. Hier sind mehrere Ansätze:
explizit 10 auf eine nullbare Ganzzahl gegossen (int?
):
<code class="language-csharp">int? x = GetBoolValue() ? (int?)10 : null;</code>
Dies sagt dem Compiler ausdrücklich mit, dass 10
als nullable Ganzzahl behandelt werden sollte, sodass der null
ein gültiger zweiter Zweig sein kann.
explizit null
auf eine nullbare Ganzzahl gegossen:
<code class="language-csharp">int? x = GetBoolValue() ? 10 : (int?)null;</code>
Dies wirft ausdrücklich null
zu int?
und macht beide Seiten des ternären Operators kompatibel.
Verwenden Sie den Standardwert für int?
:
<code class="language-csharp">int? x = GetBoolValue() ? 10 : default(int?);</code>
default(int?)
bewertet null
und bietet eine Art von Typ-sicher, um den Nullfall darzustellen. Dies wird oft für Klarheit bevorzugt.
Alle drei Lösungen erzielen das gleiche Ergebnis: x
wird entweder 10
(als int?
) oder null
basierend auf dem Ergebnis von GetBoolValue()
zugewiesen. Der Schlüssel besteht darin, sicherzustellen, dass beide Zweige des ternären Operators den gleichen kompatiblen Typ haben. Die Verwendung des Schlüsselworts default
wird im Allgemeinen als lesbarste und wartbarste Lösung angesehen.
Das obige ist der detaillierte Inhalt vonWarum ist 'getBoolValue ()? 10: null` verboten in einem C# ternären Operator?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!