Operator „?“ (C#-Referenz)

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.

Ab C# 9.0 weisen bedingte Ausdrücke das Typ des Ziels auf. 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 var-Schlüsselwort nutzen oder in C# 8.0 oder älteren Versionen, 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

Ab C# 7.2 kann eine lokale ref-Variable oder eine schreibgeschützte lokale ref-Variable mit dem bedingten ref-Ausdruck bedingt zugewiesen werden. Sie können einen bedingten ref-Ausdruck auch als Verweisrückgabewert oder als ref-Methodenargument verwenden.

Die Syntax für den bedingten ref-Ausdruck lautet folgendermaßen:

condition ? ref consequent : ref alternative

Wie der ursprüngliche bedingte Operator wertet der bedingte ref-Ausdruck nur einen von zwei Ausdrücken aus: entweder consequent oder alternative.

Im Fall des bedingten ref-Ausdrucks muss der Typ von consequent und alternative identisch sein. Bedingte ref-Ausdrücke weisen nicht den Typ des Ziels auf.

Im folgenden Beispiel wird die Verwendung des bedingten ref-Ausdrucks veranschaulicht:

var smallArray = new int[] { 1, 2, 3, 4, 5 };
var largeArray = new int[] { 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

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.

Weitere Informationen zu in C# 7.2 und höher eingeführten Features finden Sie in den folgenden Featurevorschlägen:

Weitere Informationen