Compartir vía


Operador ?: 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. Las expresiones condicionales tienen el 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 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

Una expresión ref condicional devuelve condicionalmente una referencia de variable, como se muestra en el ejemplo siguiente:

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

Puede realizar una asignación ref para el resultado de una expresión ref condicional, usarlo como referencia de devolución o pasarlo como parámetros de método ref, out, in o ref readonly. También puede asignar al resultado de una expresión ref condicional, como se muestra en el ejemplo anterior.

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

condition ? ref consequent : ref alternative

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

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

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:

Consulte también