Operator „?“ (C#-Referenz)?: operator (C# reference)

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.The conditional operator ?:, also known as the ternary conditional operator, evaluates a Boolean expression and returns the result of one of the two expressions, depending on whether the Boolean expression evaluates to true or false.

Die Syntax für den bedingten Operator lautet:The syntax for the conditional operator is as follows:

condition ? consequent : alternative

Der condition-Ausdruck muss als true oder false ausgewertet werden.The condition expression must evaluate to true or false. Wenn condition``true ergibt, wird der consequent-Ausdruck ausgewertet, und das Ergebnis ist das Ergebnis des Vorgangs.If condition evaluates to true, the consequent expression is evaluated, and its result becomes the result of the operation. Wenn condition``false ergibt, wird der alternative-Ausdruck ausgewertet, und das Ergebnis ist das Ergebnis des Vorgangs.If condition evaluates to false, the alternative expression is evaluated, and its result becomes the result of the operation. Nur consequent oder alternative wird ausgewertet.Only consequent or alternative is evaluated.

Der Typ von consequent und alternative muss identisch sein, oder es muss eine implizite Konvertierung von einem Typ in einen anderen vorhanden sein.The type of consequent and alternative must be the same, or there must be an implicit conversion from one type to the other.

Der bedingte Operator ist rechtsassoziativ, d.h. ein Ausdruck der FormThe conditional operator is right-associative, that is, an expression of the form

a ? b : c ? d : e

wird als ausgewertet,is evaluated as

a ? b : (c ? d : e)

Tipp

Sie können sich anhand der folgenden Gedächtnisstütze merken, wie der bedingte Operator ausgewertet wird:You can use the following mnemonic device to remember how the conditional operator is evaluated:

is this condition true ? yes : no

Im folgenden Beispiel wird die Verwendung des bedingten Operators veranschaulicht:The following example demonstrates the usage of the conditional operator:

double sinc(double x) => x != 0.0 ? Math.Sin(x) / x : 1;

Console.WriteLine(sinc(0.1));
Console.WriteLine(sinc(0.0));
// Output:
// 0.998334166468282
// 1

Bedingter ref-AusdruckConditional ref expression

Ab C# 7.2 kann eine lokale ref-Variable oder eine schreibgeschützte lokale ref-Variable mit dem bedingten ref-Ausdruck bedingt zugewiesen werden.Beginning with C# 7.2, a ref local or ref readonly local variable can be assigned conditionally with the conditional ref expression. Sie können den bedingten ref-Ausdruck auch als Verweisrückgabewert oder als ref-Methodenargument verwenden.You can also use the conditional ref expression as a reference return value or as a ref method argument.

Die Syntax für den bedingten ref-Ausdruck lautet:The syntax for the conditional ref expression is as follows:

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.Like the original conditional operator, the conditional ref expression evaluates only one of the two expressions: either consequent or alternative.

Im Fall des bedingten ref-Ausdrucks muss der Typ von consequent und alternative identisch sein.In the case of the conditional ref expression, the type of consequent and alternative must be the same.

Im folgenden Beispiel wird die Verwendung des bedingten ref-Ausdrucks veranschaulicht:The following example demonstrates the usage of the conditional ref expression:

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..else-AnweisungConditional operator and an if..else statement

Die Verwendung des bedingten Operators anstelle einer if-else-Anweisung führt in Fällen, in denen Sie einen Wert bedingt berechnen müssen, möglicherweise zu präziserem Code.Use of the conditional operator instead of an if-else statement might result in more concise code in cases when you need conditionally to compute a value. Das folgende Beispiel zeigt zwei Möglichkeiten, eine ganze Zahl als negativ oder nicht negativ zu klassifizieren:The following example demonstrates two ways to classify an integer as negative or nonnegative:

int input = new Random().Next(-5, 5);

string classify;
if (input >= 0)
{
    classify = "nonnegative";
}
else
{
    classify = "negative";
}

classify = (input >= 0) ? "nonnegative" : "negative";

OperatorüberladbarkeitOperator overloadability

Ein benutzerdefinierter Typ kann den bedingten Operator nicht überladen.A user-defined type cannot overload the conditional operator.

C#-SprachspezifikationC# language specification

Weitere Informationen finden Sie im Abschnitt Bedingter Operator der C#-Sprachspezifikation.For more information, see the Conditional operator section of the C# language specification.

Weitere Informationen zum bedingten REF-Ausdruck finden Sie unter Hinweis zum Featurevorschlag.For more information about the conditional ref expression, see the feature proposal note.

Siehe auchSee also