Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O operador ?:condicional, também conhecido como operador condicional ternário, avalia uma expressão booleana e retorna o resultado de uma das duas expressões, dependendo se a expressão booleana avalia para true ou false, como 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 para o operador condicional é a seguinte:
condition ? consequent : alternative
A referência da linguagem C# documenta a versão mais recentemente lançada da linguagem C#. Contém também documentação inicial para funcionalidades em versões preliminares públicas para a próxima versão da linguagem.
A documentação identifica qualquer funcionalidade introduzida pela primeira vez nas últimas três versões da língua ou em pré-visualizações públicas atuais.
Gorjeta
Para saber quando uma funcionalidade foi introduzida pela primeira vez em C#, consulte o artigo sobre o histórico de versões da linguagem C#.
A condition expressão deve avaliar para true ou false. Se condition for avaliada como true, a consequent expressão é avaliada e o seu resultado torna-se o resultado da operação. Se condition for avaliada como false, a alternative expressão é avaliada e o seu resultado torna-se o resultado da operação. Apenas consequent ou alternative é avaliado. As expressões condicionais são tipificadas de destino. Ou seja, se um tipo de destino de uma expressão condicional é conhecido, os tipos de e consequent devem ser implicitamente conversíveis para o tipo de alternative 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 é desconhecido (por exemplo, quando você usa a var palavra-chave) ou o tipo de consequent e alternative deve ser o mesmo ou deve haver uma conversão implícita de um tipo para o outro:
var rand = new Random();
var condition = rand.NextDouble() > 0.5;
var x = condition ? 12 : (int?)null;
O operador condicional é associativo à direita, isto é, uma expressão da forma
a ? b : c ? d : e
é avaliada como
a ? b : (c ? d : e)
Gorjeta
Você pode usar o seguinte dispositivo mnemônico para lembrar como o operador condicional é avaliado:
is this condition true ? yes : no
Expressão ref condicional
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
Pode ref atribuir o resultado de uma expressão ref condicional. Use-o como retorno de referência ou passe como um refparâmetro , out, in, ou ref readonlyde 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 ref condicional é a seguinte:
condition ? ref consequent : ref alternative
Como o operador condicional, uma expressão ref condicional avalia apenas uma das duas expressões: ou consequentalternative.
Em uma expressão ref condicional, o tipo de consequent e alternative deve ser o mesmo. As expressões ref condicionais não são tipificadas de destino.
Operador condicional e uma if declaração
Usar o operador condicional em vez de umaif instrução pode resultar num código mais conciso quando é necessário calcular condicionalmente um valor. 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 obter mais informações, consulte a seção Operador condicional da especificação da linguagem C#.
As especificações para recursos mais recentes são: