Freigeben über


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 conditiontrue ergibt, wird der consequent-Ausdruck ausgewertet, und das Ergebnis ist das Ergebnis des Vorgangs. Wenn conditionfalse 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 ref 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:

Siehe auch