Оператор ?: (справочник по C#)?: Operator (C# Reference)

Условный оператор (?:), известный как тернарный условный оператор, возвращает одно из двух значений в зависимости от значения логического выражения.The conditional operator (?:), commonly known as the ternary conditional operator, returns one of two values depending on the value of a Boolean expression. Для условного оператора используется следующий синтаксис.Following is the syntax for the conditional operator.

condition ? first_expression : second_expression;  

Начиная с C# версии 7.2, выражения first_expression и second_expression могут быть refвыражениями с.Beginning with C# 7.2, the first_expression and second_expression my be ref expressions:

ref condition ? ref first_expression : ref second_expression;  

Результат может быть присвоен переменной с ref или ref readonly, или переменной без модификатора.The result may be assigned to a ref or ref readonly variable, or to a variable with neither modifier.

ПримечанияRemarks

Параметр condition должен иметь значение true или false.The condition must evaluate to true or false. Если параметр condition имеет значение true, вычисляется выражение first_expression и итог этого вычисления становится результатом.If condition is true, first_expression is evaluated and becomes the result. Если параметр condition имеет значение false, вычисляется выражение second_expression и итог этого вычисления становится результатом.If condition is false, second_expression is evaluated and becomes the result. В любом случае вычисляется только одно из двух выражений.Only one of the two expressions is evaluated. Это особенно важно для выражений, в которых результат с модификатором ref, так как следующий код является допустимым.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;

Ссылка на storage не вычисляется, если storage имеет значение NULL.The reference to storage is not evaluated when storage is null.

Когда результат представляет собой значение, параметры first_expression и second_expression должны быть одинакового типа или должно существовать неявное преобразование из одного типа в другой.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. Если результат с ref, параметры first_expression и second_expression должны быть одинакового типа.When the result is a ref, the type of first_expression and second_expression must be the same.

Расчеты, которые в другом случае требовали бы уточнения конструкции if-else, можно выражать с помощью условного оператора.You can express calculations that might otherwise require an if-else construction more concisely by using the conditional operator. Например, в следующем коде сначала используется оператор if, а затем — условный оператор для классификации целого числа как положительного или отрицательного.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";  

Условный оператор имеет правую ассоциативность.The conditional operator is right-associative. Выражение a ? b : c ? d : e вычисляется как a ? b : (c ? d : e), а не как (a ? b : c) ? d : e.The expression a ? b : c ? d : e is evaluated as a ? b : (c ? d : e), not as (a ? b : c) ? d : e.

Условный оператор не может быть перегружен.The conditional operator cannot be overloaded.

ПримерExample

Ниже приведен пример условного оператора, когда результат является значением.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

А в следующем примере условного оператора результат является ссылкой.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

См. такжеSee Also