?: 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 consequent
alternative
.
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 :