Поделиться через


?: оператор — тернарный условный оператор

Условный оператор ?:, также называемый тернарным, вычисляет логическое выражение и в зависимости от полученного значения true или false возвращает результат одного из двух соответствующих выражений, как показано в следующем примере.

string GetWeatherDisplay(double tempInCelsius) => tempInCelsius < 20.0 ? "Cold." : "Perfect!";

Console.WriteLine(GetWeatherDisplay(15));  // output: Cold.
Console.WriteLine(GetWeatherDisplay(27));  // output: Perfect!

Как показано в предыдущем примере, синтаксис условного оператора выглядит следующим образом.

condition ? consequent : alternative

Выражение condition должно принимать значение true или false. Если condition принимает значение true, вычисляется выражение consequent, а результат становится результатом операции. Если condition принимает значение false, вычисляется выражение alternative, а результат становится результатом операции. Вычисляется только выражение consequent или alternative. Условные выражения являются целевыми типами. Это значит, что если известен целевой тип условного выражения, типы consequent и alternative должны быть неявно преобразованы в целевой тип, как показано в следующем примере:

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 };

Если целевой тип условного выражения неизвестен (например, при использовании var ключевого слова) или тип consequent и alternative должен быть одинаковым, или должно быть неявное преобразование одного типа в другой:

var rand = new Random();
var condition = rand.NextDouble() > 0.5;

var x = condition ? 12 : (int?)null;

Условный оператор имеет правую ассоциативность, то есть выражение формы.

a ? b : c ? d : e

вычисляется как

a ? b : (c ? d : e)

Совет

Вы можете использовать следующий мнемонический прием, чтобы запомнить, как оценивается условный оператор:

is this condition true ? yes : no

Условное выражение REF

Условное выражение ссылочного выражения условно возвращает ссылку на переменную, как показано в следующем примере:

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

Вы можете ref назначить результат условного ссылочного выражения, использовать его в качестве возвращаемого ссылки или передать его в качестве параметра метода , inoutили ref readonly в качестве refпараметра метода. Вы также можете назначить результат условного выражения ссылок, как показано в предыдущем примере.

Для условного выражения REF используется следующий синтаксис:

condition ? ref consequent : ref alternative

Как и условный оператор, выражение условного ссылок оценивает только одно из двух выражений: либо consequent alternative.

В выражении условного consequent ссылок тип и alternative должен быть одинаковым. Условные выражения ссылок не являются целевыми типами.

Условный оператор и оператор if

Если использовать условный оператор вместо оператора if, может получиться более лаконичный код в случаях, когда необходимо условно вычислить значение. В следующем примере иллюстрируются два вида классификации целого числа как положительного или отрицательного:

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

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

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

Возможность перегрузки оператора

Определяемый пользователем тип не может перегружать условный оператор.

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

Дополнительные сведения см. в разделе Условный оператор статьи Предварительная спецификация C# 6.0.

Спецификации новых функций:

См. также