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: