?: opérateur : opérateur conditionnel ternaire

L’opérateur ?:conditionnel , également appelé opérateur conditionnel ternaire, évalue une expression booléenne et retourne le résultat de l’une des deux expressions, selon que l’expression booléenne prend true la valeur ou false, comme le montre 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.

À compter de C# 9.0, les expressions conditionnelles sont de type cible. Autrement dit, si un type cible d’une expression conditionnelle est connu, les types de consequent et alternative doivent être implicitement convertibles en type cible, comme le montre 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 un type cible d’une expression conditionnelle est inconnu (par exemple, lorsque vous utilisez le var mot clé) ou si le type de consequent et alternative doit être identique ou qu’il doit y avoir une conversion implicite d’un type à l’autre :

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 variable locale ref ou ref en lecture seule peut être affectée de manière conditionnelle avec une expression ref conditionnelle. Vous pouvez également utiliser une expression ref conditionnelle comme valeur de retour de référence ou comme argument deref méthode.

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

condition ? ref consequent : ref alternative

Comme l’opérateur conditionnel d’origine, une expression ref conditionnelle évalue une seule des deux expressions : ou consequentalternative.

Dans une expression ref conditionnelle, le type de consequent et alternative doit être identique. Les expressions ref conditionnelles ne sont pas de type cible.

L’exemple suivant illustre l’utilisation d’une expression ref conditionnelle :

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

Opérateur conditionnel et instruction if

L’utilisation de l’opérateur conditionnel au lieu d’une instruction peut entraîner un if code plus concis dans les cas où vous devez calculer une valeur de manière conditionnelle. 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 fonctionnalités plus récentes sont les suivantes :

Voir aussi