Operador ?: – o operador condicional ternário

O operador condicional ?:, também conhecido como o operador condicional ternário, avalia uma expressão booliana e retorna o resultado de uma das duas expressões, dependendo se a expressão booliana é avaliada como true ou false, conforme mostra o exemplo a seguir:

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

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

Como mostra o exemplo anterior, a sintaxe do operador condicional é a seguinte:

condition ? consequent : alternative

A expressão condition deve ser avaliada para true ou false. Se condition for avaliada como true, a expressão consequent será avaliada e seu resultado se tornará o resultado da operação. Se condition for avaliada como false, a expressão alternative será avaliada e seu resultado se tornará o resultado da operação. Somente consequent ou alternative é avaliada. As expressões condicionais têm o tipo de destino. Ou seja, se um tipo de destino de uma expressão condicional for conhecido, os tipos de consequent e alternative devem ser implicitamente conversíveis para o tipo de destino, como mostra o exemplo a seguir:

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

Se um tipo de destino de uma expressão condicional for desconhecido (por exemplo, quando você usa a palavra-chave var) ou o tipo consequent e alternative precisa ser o mesmo ou precisa haver uma conversão implícita de um tipo para outro:

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

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

O operador condicional é associativo direito, ou seja, uma expressão da forma

a ? b : c ? d : e

é avaliada como

a ? b : (c ? d : e)

Dica

Você pode usar o seguinte dispositivo mnemônico para se lembrar de como o operador condicional é avaliado:

is this condition true ? yes : no

Expressão condicional ref

Uma expressão ref condicional retorna condicionalmente uma referência de variável, como mostra o exemplo a seguir:

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

Você pode ref atribuir o resultado de uma expressão de referência condicional, usá-lo como um retorno de referência ou passá-lo como um ref, out, in, ou ref readonly parâmetro de método. Você também pode atribuir ao resultado de uma expressão ref condicional, como mostra o exemplo anterior.

A sintaxe de uma expressão condicional ref é a seguinte:

condition ? ref consequent : ref alternative

Como o operador condicional, uma expressão ref condicional avalia apenas uma das duas expressões: consequent ou alternative.

Em uma expressão ref condicional, o tipo de consequent e alternative devem ser iguais. Expressões ref condicionais não são com tipo de destino.

Operador condicional e uma instrução if

O uso do operador condicional em vez de uma instrução if pode resultar em código mais conciso em casos onde você precisa calcular um valor condicionalmente. O exemplo a seguir demonstra duas maneiras de classificar um inteiro como negativo ou não negativo:

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

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

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

Capacidade de sobrecarga do operador

Um tipo definido pelo usuário não pode sobrecarregar o operador condicional.

Especificação da linguagem C#

Para saber mais, confira a seção Operador condicional na especificação da linguagem C#.

As especificações para recursos mais recentes são:

Confira também