?: operador : operador condicional ternario

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 un tipo de destino de una expresión condicional (por ejemplo, cuando se usa la var palabra clave ) o el tipo de consequent y alternative debe ser el mismo o 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

Una variable local ref o ref readonly local se puede asignar condicionalmente con una expresión ref condicional. 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 una expresión ref condicional, el tipo de consequent y alternative debe ser el mismo. Las expresiones ref condicionales no tienen el 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#.

Las especificaciones de las características más recientes son:

Vea también