?: Оператор (ссылка C#)?: Operator (C# Reference)

Условный оператор ?:, известный как тернарный условный оператор, вычисляет логическое выражение и возвращает результат вычисления одного из двух выражений, в зависимости от того, чему равно значение логического выражения: true или false.The conditional operator ?:, commonly known as the ternary conditional operator, evaluates a Boolean expression, and returns the result of evaluating one of two expressions, depending on whether the Boolean expression evaluates to true or false. Начиная с C# 7.2, условное выражение REF возвращает ссылку на результат одного из двух выражений.Beginning with C# 7.2, the conditional ref expression returns the reference to the result of one of the two expressions.

Для условного оператора используется следующий синтаксис:The syntax for the conditional operator is as follows:

condition ? consequent : alternative

Выражение condition должно принимать значение true или false.The condition expression must evaluate to true or false. Если condition принимает значение true, вычисляется выражение consequent, а результат становится результатом операции.If condition evaluates to true, the consequent expression is evaluated, and its result becomes the result of the operation. Если condition принимает значение false, вычисляется выражение alternative, а результат становится результатом операции.If condition evaluates to false, the alternative expression is evaluated, and its result becomes the result of the operation. Вычисляется только выражение consequent или alternative.Only consequent or alternative is evaluated.

Параметры consequent и alternative должны быть одинакового типа, или должно существовать неявное преобразование из одного типа в другой.The type of consequent and alternative must be the same, or there must be an implicit conversion from one type to the other.

Условный оператор имеет правую ассоциативность, то есть выражение формы.The conditional operator is right-associative, that is, an expression of the form

a ? b : c ? d : e

вычисляется какis evaluated as

a ? b : (c ? d : e)

В качестве удобного мнемонического приема, который поможет запомнить, как вычисляется этот оператор, можно использовать следующий вопрос:A handy mnemonic device you can use to remember how this operator evaluates is by asking:

is this condition true ? yes : no

где часть фразы до "?"with the ? выступает в качестве вопроса для предыдущего выражения, а последующая часть фразы является логическим ответом на этот вопрос.part of the operator acting as a question mark for the previous statement, and the consequent acting as the logical response to this question.

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

Условное выражение REFConditional ref expression

Начиная с C# 7.2, условное выражение REF можно использовать для того, чтобы вернуть ссылку на результат одного из двух выражений.Beginning with C# 7.2, you can use the conditional ref expression to return the reference to the result of one of the two expressions. Можно назначить эту ссылку ссылочной локальной переменной или ссылочной локальной переменной только для чтения или же использовать ее как возвращаемое ссылочное значение или как ref параметр метода.You can assign that reference to a ref local or ref readonly local variable, or use it as a reference return value or as a ref method parameter.

Для условного выражения REF используется следующий синтаксис:The syntax for the conditional ref expression is as follows:

condition ? ref consequent : ref alternative

Подобно исходному условному оператору, условное выражение REF вычисляет только одно из двух выражений: consequent или alternative.Like the original conditional operator, the conditional ref expression evaluates only one of the two expressions: either consequent or alternative.

Для условного выражения REF тип consequent и alternative должны совпадать.In the case of the conditional ref expression, the type of consequent and alternative must be the same.

В следующем примере иллюстрируется использование условного выражения REF: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

Дополнительные сведения см. в примечании к предлагаемой функции.For more information, see the feature proposal note.

Условный оператор и оператор if..elseConditional operator and an if..else statement

Если использовать условный оператор с оператором if-else, может получиться более лаконичный код в случаях, когда необходимо условно вычислить значение.Use of the conditional operator over an if-else statement might result in more concise code in cases when you need conditionally to compute a value. В следующем примере иллюстрируются два вида классификации целого числа как положительного или отрицательного: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 overloadability

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

Спецификация языка C#C# language specification

Дополнительные сведения см. в разделе Условный оператор статьи Предварительная спецификация C# 6.0.For more information, see the Conditional operator section of the C# language specification.

См. такжеSee also