Opérateur ?: - L’opérateur conditionnel ternaire

L’opérateur conditionnel ?:, également appelé opérateur conditionnel ternaire, évalue une expression booléenne et renvoie le résultat de l’une des deux expressions, selon que l’expression booléenne est évaluée true ou false, comme l’illustre l’exemple suivant :

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

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

Comme le montre l’exemple précédent, la syntaxe de l’opérateur conditionnel est la suivante :

condition ? consequent : alternative

L'expression condition doit donner true ou false. Si condition prend la valeur true, l’expression consequent est évaluée et son résultat devient le résultat de l’opération. Si condition prend la valeur false, l’expression alternative est évaluée et son résultat devient le résultat de l’opération. Soit consequent, soit alternative est évaluée. Les expressions conditionnelles sont typées cible. Autrement dit, si le type cible d’une expression conditionnelle est connu, les types de consequentalternative doivent être implicitement convertibles en type cible, comme l’illustre l’exemple suivant :

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 le type cible d’une expression conditionnelle est inconnu (par exemple, lorsque vous utilisez le mot clé var) ou si le type de consequent ou alternative doit être identique, ou si une conversion implicite d’un type à l’autre est nécessaire :

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

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

L’opérateur conditionnel est associatif à droite ; autrement dit, une expression de la forme :

a ? b : c ? d : e

est évaluée comme étant

a ? b : (c ? d : e)

Conseil

Vous pouvez utiliser l’appareil mnémonique suivant pour vous souvenir du mode d’évaluation de l’opérateur conditionnel :

is this condition true ? yes : no

Expression ref conditionnelle

Une expression ref conditionnelle retourne de manière conditionnelle une référence de variable, comme le montre l’exemple suivant :

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

Vous pouvez ref affecter le résultat d’une expression ref conditionnelle, utilisez-le comme retour de référence ou passez-le en tant paramètre de méthoderef, out, in, ou ref readonly. Vous pouvez également affecter au résultat d’une expression ref conditionnelle, comme le montre l’exemple précédent.

La syntaxe d’une expression ref conditionnelle est la suivante :

condition ? ref consequent : ref alternative

Comme l’opérateur conditionnel, une expression ref n’évalue qu’une des deux expressions : consequent ou alternative.

Dans une expression ref conditionnelle, consequent et alternative doivent être du même type. Les expressions ref conditionnelles ne sont pas typées par la cible.

Opérateur conditionnel et instruction if

L’utilisation de l’opérateur conditionnel au lieu d’une instruction if permet de rester concis dans l’écriture du code lorsque l’objectif est de calculer une valeur sous condition. L’exemple suivant montre deux façons de classer un entier comme négatif ou non :

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

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

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

Capacité de surcharge de l’opérateur

Un type défini par l’utilisateur ne peut pas surcharger l’opérateur conditionnel.

spécification du langage C#

Pour plus d’informations, voir la section Opérateur conditionnel de la spécification du langage C#.

Les spécifications des nouvelles fonctionnalités sont les suivantes :

Voir aussi