Opérateur ?: (référence C#)

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 a pour valeur true 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 le type cible d’une expression conditionnelle est inconnu (par exemple, lorsque vous utilisez le var mot clé) ou en C# 8,0 et les versions antérieures, le type de consequent et alternative doit être identique ou 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

À compter de C# 7,2, une variable locale Ref locale ou ref ReadOnly peut être assigné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 ref argument de méthode.

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

condition ? ref consequent : ref alternative

À l’instar de l’opérateur conditionnel d’origine, une expression Ref conditionnelle évalue uniquement l’une des deux expressions : consequent ou alternative .

Dans le cas d’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 if instruction peut entraîner un code plus concis dans les cas où vous avez besoin de 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#.

Pour plus d’informations sur les fonctionnalités ajoutées dans C# 7,2 et versions ultérieures, consultez les notes de proposition de fonctionnalités suivantes :

Voir aussi