?: оператор — тернарный условный оператор
Условный оператор ?:
, также называемый тернарным, вычисляет логическое выражение и в зависимости от полученного значения 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
.
Начиная с C# 9.0 условные выражения имеют целевой тип. Это значит, что если известен целевой тип условного выражения, типы 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
Локальная переменная ref или ref только для чтения локальная переменная может быть назначена условно с помощью условного выражения ref. Кроме того, условное выражение REF можно использовать как возвращаемое ссылочное значение или как аргумент метода ref
.
Для условного выражения REF используется следующий синтаксис:
condition ? ref consequent : ref alternative
Подобно исходному условному оператору, условное выражение REF вычисляет только одно из двух выражений: consequent
или alternative
.
В выражении условной ссылки тип consequent
и alternative
должен быть одинаковым. Выражения условной ссылки не являются целевыми.
В следующем примере иллюстрируется использование условного выражения REF:
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
Условный оператор и оператор 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.
Спецификации для новых функций: