Operador ?: (referencia de C#)

El operador condicional ?:, también conocido como operador condicional ternario, evalúa una expresión booleana y devuelve el resultado de una de las dos expresiones, en función de que la expresión booleana se evalúe como true o false, tal y como se muestra en el siguiente ejemplo:

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

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

Como se muestra en el ejemplo anterior, la sintaxis del operador condicional es la siguiente:

condition ? consequent : alternative

La expresión condition debe evaluarse como true o false. Si condition se evalúa como true, se evalúa la expresión consequent y su resultado se convierte en el resultado de la operación. Si condition se evalúa como false, se evalúa la expresión alternative y su resultado se convierte en el resultado de la operación. Solo se evalúan consequent o alternative.

A partir de C# 9.0, las expresiones condicionales tienen tipo de destino. Es decir, si se conoce el tipo de destino de una expresión condicional, los tipos de consequent y alternative se deben poder convertir implícitamente al tipo de destino, como se muestra en el ejemplo siguiente:

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

Si se desconoce el tipo de destino de una expresión condicional (por ejemplo, al usar la palabra clave var) o en C# 8.0 y versiones anteriores, el tipo de consequent y alternative debe ser el mismo, o bien debe haber una conversión implícita de un tipo a otro:

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

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

El operador condicional es asociativo a la derecha, es decir, una expresión de la forma

a ? b : c ? d : e

se evalúa como

a ? b : (c ? d : e)

Sugerencia

Puede utilizar el siguiente recurso mnemotécnico para recordar cómo se evalúa el operador condicional:

is this condition true ? yes : no

Expresión condicional ref

A partir de C# 7.2, las variables locales de tipo ref o ref readonly se pueden asignar condicionalmente con una expresión condicional ref. También puede usar una expresión condicional ref como un valor devuelto de referencia o como un método de argumento de ref.

La sintaxis de una expresión condicional ref es la siguiente:

condition ? ref consequent : ref alternative

Como sucede con el operador condicional original, una expresión condicional ref evalúa solo una de las dos expresiones, ya sea consequent o alternative.

En el caso de una expresión condicional ref, los tipos de consequent y alternative deben coincidir. Las expresiones condicionales ref no tienen tipo de destino.

En el ejemplo siguiente se muestra el uso de una expresión condicional 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

Operador condicional y una instrucción if

Es posible que el uso del operador condicional en lugar de una instrucción if genere código más conciso en aquellos casos en los que tenga que calcular un valor condicionalmente. El ejemplo siguiente muestra dos maneras de clasificar un entero como negativo o no negativo:

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

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

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

Posibilidad de sobrecarga del operador

Un tipo definido por el usuario no puede sobrecargar el operador condicional.

Especificación del lenguaje C#

Para más información, vea la sección sobre operadores condicionales de la Especificación del lenguaje C#.

Para obtener más información sobre de las características agregadas en C# 7.2 y versiones posteriores, vea las siguientes notas de propuesta de características:

Vea también