Operador ?: (referencia de C#)?: operator (C# reference)

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.The conditional operator ?:, also known as the ternary conditional operator, evaluates a Boolean expression and returns the result of one of the two expressions, depending on whether the Boolean expression evaluates to true or false.

La sintaxis del operador condicional es la siguiente:The syntax for the conditional operator is as follows:

condition ? consequent : alternative

La expresión condition debe evaluarse como true o false.The condition expression must evaluate to true or 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.If condition evaluates to true, the consequent expression is evaluated, and its result becomes the result of the operation. 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.If condition evaluates to false, the alternative expression is evaluated, and its result becomes the result of the operation. Solo se evalúan consequent o alternative.Only consequent or alternative is evaluated.

A partir de C# 9.0, las expresiones condicionales tienen tipo de destino.Beginning with C# 9.0, conditional expressions are target-typed. 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:That is, if a target type of a conditional expression is known, the types of consequent and alternative must be implicitly convertible to the target type, as the following example shows:

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:If a target type of a conditional expression is unknown (for example, when you use the var keyword) or in C# 8.0 and earlier, the type of consequent and alternative must be the same or there must be an implicit conversion from one type to the other:

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 formaThe conditional operator is right-associative, that is, an expression of the form

a ? b : c ? d : e

se evalúa comois evaluated as

a ? b : (c ? d : e)

Sugerencia

Puede utilizar el siguiente recurso mnemotécnico para recordar cómo se evalúa el operador condicional:You can use the following mnemonic device to remember how the conditional operator is evaluated:

is this condition true ? yes : no

En el siguiente ejemplo se muestra el uso del operador condicional:The following example demonstrates the usage of the conditional operator:

double sinc(double x) => x != 0.0 ? Math.Sin(x) / x : 1;

Console.WriteLine(sinc(0.1));
Console.WriteLine(sinc(0.0));
// Output:
// 0.998334166468282
// 1

Expresión condicional refConditional ref expression

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.Beginning with C# 7.2, a ref local or ref readonly local variable can be assigned conditionally with a conditional ref expression. También puede usar una expresión condicional ref como un valor devuelto de referencia o como un método de argumento de ref.You can also use a conditional ref expression as a reference return value or as a ref method argument.

La sintaxis de una expresión condicional ref es la siguiente:The syntax for a conditional ref expression is as follows:

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.Like the original conditional operator, a conditional ref expression evaluates only one of the two expressions: either consequent or alternative.

En el caso de una expresión condicional ref, los tipos de consequent y alternative deben coincidir.In the case of a conditional ref expression, the type of consequent and alternative must be the same. Las expresiones condicionales ref no tienen tipo de destino.Conditional ref expressions are not target-typed.

En el ejemplo siguiente se muestra el uso de una expresión condicional ref:The following example demonstrates the usage of a conditional ref expression:

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..elseConditional operator and an if..else statement

Es posible que el uso del operador condicional en lugar de una instrucción if-else genere código más conciso en aquellos casos en los que tenga que calcular un valor condicionalmente.Use of the conditional operator instead of an if-else statement might result in more concise code in cases when you need conditionally to compute a value. El ejemplo siguiente muestra dos maneras de clasificar un entero como negativo o no negativo:The following example demonstrates two ways to classify an integer as negative or nonnegative:

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 operadorOperator overloadability

Un tipo definido por el usuario no puede sobrecargar el operador condicional.A user-defined type cannot overload the conditional operator.

Especificación del lenguaje C#C# language specification

Para más información, vea la sección sobre operadores condicionales de la Especificación del lenguaje C#.For more information, see the Conditional operator section of the C# language specification.

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:For more information about features added in C# 7.2 and later, see the following feature proposal notes:

Vea tambiénSee also