Operator ?: (C#-Referenz)?: Operator (C# Reference)

Der bedingte Operator (?:), gemeinhin als ternärer bedingter Operator bekannt, gibt abhängig vom Wert eines booleschen Ausdrucks einen von zwei Werten zurück.The conditional operator (?:), commonly known as the ternary conditional operator, returns one of two values depending on the value of a Boolean expression. Nachfolgend ist die Syntax für den bedingten Operator aufgeführt.Following is the syntax for the conditional operator.

condition ? first_expression : second_expression;  

Beginnend mit C# 7.2 können first_expression und second_expression ref-Ausdrücke sein:Beginning with C# 7.2, the first_expression and second_expression my be ref expressions:

ref condition ? ref first_expression : ref second_expression;  

Das Ergebnis kann einer ref- oder ref readonly-Variablen oder einer Variable mit keinem der beiden Modifizierer zugewiesen werden.The result may be assigned to a ref or ref readonly variable, or to a variable with neither modifier.

HinweiseRemarks

condition muss mit true oder false ausgewertet werden.The condition must evaluate to true or false. Wenn condition den Wert true hat, wird first_expression ausgewertet.If condition is true, first_expression is evaluated and becomes the result. Wenn condition den Wert false hat, wird second_expression ausgewertet.If condition is false, second_expression is evaluated and becomes the result. Nur einer der beiden Ausdrücke wird ausgewertet.Only one of the two expressions is evaluated. Dies ist besonders wichtig für Ausdrücke, deren Ergebnis ein ref ist, da Folgendes gilt:This is particularly important for expressions where the result is a ref, as the following is valid:

ref (storage != null) ? ref storage[3] : ref defaultValue;

Der Verweis auf storage wird nicht ausgewertet, wenn storage null ist.The reference to storage is not evaluated when storage is null.

Wenn das Ergebnis ein Wert ist, muss der Typ von first_expression und second_expression identisch sein, oder es muss eine implizite Konvertierung von einem Typ in einen anderen vorhanden sein.When the result is a value, the type of first_expression and second_expression must be the same, or there must be an implicit conversion from one type to the other. Wenn das Ergebnis ein ref ist, muss der Typ von first_expression und second_expression identisch sein.When the result is a ref, the type of first_expression and second_expression must be the same.

Sie können mithilfe des bedingten Operators Berechnungen präziser ausdrücken, die andernfalls möglicherweise eine if-else-Konstruktion benötigen.You can express calculations that might otherwise require an if-else construction more concisely by using the conditional operator. Im folgenden Code wird z. B. zuerst eine if-Anweisung und anschließend ein bedingter Operator verwendet, um eine ganze Zahl als positiv oder negativ zu klassifizieren.For example, the following code uses first an if statement and then a conditional operator to classify an integer as positive or negative.

int input = Convert.ToInt32(Console.ReadLine());  
string classify;  
  
// if-else construction.  
if (input > 0)  
    classify = "positive";  
else  
    classify = "negative";  
  
// ?: conditional operator.  
classify = (input > 0) ? "positive" : "negative";  

Der bedingte Operator ist rechtsassoziativ.The conditional operator is right-associative. Der Ausdruck a ? b : c ? d : e wird als a ? b : (c ? d : e) und nicht als (a ? b : c) ? d : e ausgewertet.The expression a ? b : c ? d : e is evaluated as a ? b : (c ? d : e), not as (a ? b : c) ? d : e.

Der bedingte Operator kann nicht überladen werden.The conditional operator cannot be overloaded.

BeispielExample

Das folgende Beispiel zeigt den bedingten Operator, dessen Ergebnis ein Wert ist:The following example shows the conditional operator whose result is a value:

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

Die folgende Alternative zeigt den bedingten Operator, dessen Ergebnis ein Verweis ist:The following alternative shows the conditional operator where the result is a reference:

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

Siehe auchSee Also