Operator „?:“: der ternäre bedingte Operator
Der bedingte Operator ?:
, der auch als ternärer bedingter Operator bekannt ist, wertet einen booleschen Ausdruck aus und gibt das Ergebnis für einen der zwei Ausdrücke zurück, abhängig davon, ob der boolesche Ausdruck true
oder false
ergibt. Das folgende Beispiel stellt dies dar:
string GetWeatherDisplay(double tempInCelsius) => tempInCelsius < 20.0 ? "Cold." : "Perfect!";
Console.WriteLine(GetWeatherDisplay(15)); // output: Cold.
Console.WriteLine(GetWeatherDisplay(27)); // output: Perfect!
Wie das vorherige Beispiel zeigt, lautet die Syntax für den bedingten Operator wie folgt:
condition ? consequent : alternative
Der condition
-Ausdruck muss als true
oder false
ausgewertet werden. Wenn condition
true
ergibt, wird der consequent
-Ausdruck ausgewertet, und das Ergebnis ist das Ergebnis des Vorgangs. Wenn condition
false
ergibt, wird der alternative
-Ausdruck ausgewertet, und das Ergebnis ist das Ergebnis des Vorgangs. Nur consequent
oder alternative
wird ausgewertet. Bedingte Ausdrücke sind zieltypiert. Wenn der Zieltyp eines bedingten Ausdrucks also bekannt ist, müssen die Typen von consequent
und alternative
implizit in den Zieltyp konvertierbar sein, wie im folgenden Beispiel gezeigt wird:
var rand = new Random();
var condition = rand.NextDouble() > 0.5;
int? x = condition ? 12 : null;
IEnumerable<int> xs = x is null ? new List<int>() { 0, 1 } : new int[] { 2, 3 };
Wenn der Zieltyp eines bedingten Ausdrucks nicht bekannt ist, z. B. wenn Sie das Schlüsselwort var
nutzen, muss der Typ von consequent
und alternative
identisch sein, oder es muss eine implizite Konvertierung von einem Typ in den anderen geben:
var rand = new Random();
var condition = rand.NextDouble() > 0.5;
var x = condition ? 12 : (int?)null;
Der bedingte Operator ist rechtsassoziativ, d.h. ein Ausdruck der Form
a ? b : c ? d : e
wird als ausgewertet,
a ? b : (c ? d : e)
Tipp
Sie können sich anhand der folgenden Gedächtnisstütze merken, wie der bedingte Operator ausgewertet wird:
is this condition true ? yes : no
Bedingter ref-Ausdruck
Ein bedingter Ref-Ausdruck gibt bedingt einen Variablenverweis zurück, wie im folgenden Beispiel gezeigt:
int[] smallArray = {1, 2, 3, 4, 5};
int[] largeArray = {10, 20, 30, 40, 50};
int index = 7;
ref int refValue = ref ((index < 5) ? ref smallArray[index] : ref largeArray[index - 5]);
refValue = 0;
index = 2;
((index < 5) ? ref smallArray[index] : ref largeArray[index - 5]) = 100;
Console.WriteLine(string.Join(" ", smallArray));
Console.WriteLine(string.Join(" ", largeArray));
// Output:
// 1 2 100 4 5
// 10 20 0 40 50
Sie können das Ergebnis eines bedingten ref-Ausdrucks mit ref
assign zuweisen, es als Referenzrückgabe verwenden oder es als ref
-, out
-, in
- oder ref readonly
-Methodenparameter übergeben. Sie können auch das Ergebnis eines bedingten Verweisausdrucks zuweisen, wie im vorherigen Beispiel gezeigt.
Die Syntax für den bedingten ref-Ausdruck lautet folgendermaßen:
condition ? ref consequent : ref alternative
Wie der bedingte Operator wertet der bedingte ref-Ausdruck nur einen von zwei Ausdrücken aus: entweder consequent
oder alternative
.
Bei einem bedingten ref-Ausdrucks muss der Typ von consequent
und alternative
identisch sein. Bedingte „ref“-Ausdrücke sind nicht zieltypisiert.
Bedingter Operator und eine if
-Anweisung
Die Verwendung des bedingten Operators anstelle einer if
-Anweisung führt in Fällen, in denen Sie einen Wert bedingt berechnen müssen, möglicherweise zu präziserem Code. Das folgende Beispiel zeigt zwei Möglichkeiten, eine ganze Zahl als negativ oder nicht negativ zu klassifizieren:
int input = new Random().Next(-5, 5);
string classify;
if (input >= 0)
{
classify = "nonnegative";
}
else
{
classify = "negative";
}
classify = (input >= 0) ? "nonnegative" : "negative";
Operatorüberladbarkeit
Ein benutzerdefinierter Typ kann den bedingten Operator nicht überladen.
C#-Sprachspezifikation
Weitere Informationen finden Sie im Abschnitt Bedingter Operator der C#-Sprachspezifikation.
Es folgen Spezifikationen für neuere Features: