?: оператор — тернарный условный оператор
Условный оператор ?:
, также называемый тернарным, вычисляет логическое выражение и в зависимости от полученного значения 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
назначить результат условного ссылочного выражения, использовать его в качестве возвращаемого ссылки или передать его в качестве параметра метода , in
out
или 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.
Спецификации новых функций: