?? Opérateurs ??=, opérateurs de coalescence nulle
L’opérateur de fusion null ??
retourne la valeur de l’opérande de gauche si elle n’est pas null
; sinon, il évalue l’opérande de droite et retourne son résultat. L’opérateur ??
n’évalue pas son opérande droit si l’opérande gauche a la valeur non Null. L’opérateur de coalescence nulle ??=
assigne la valeur de son opérande droit à son opérande gauche uniquement si l’opérande gauche a la valeur null
. L’opérateur ??=
n’évalue pas son opérande droit si l’opérande gauche a la valeur non Null.
List<int>? numbers = null;
int? a = null;
Console.WriteLine((numbers is null)); // expected: true
// if numbers is null, initialize it. Then, add 5 to numbers
(numbers ??= new List<int>()).Add(5);
Console.WriteLine(string.Join(" ", numbers)); // output: 5
Console.WriteLine((numbers is null)); // expected: false
Console.WriteLine((a is null)); // expected: true
Console.WriteLine((a ?? 3)); // expected: 3 since a is still null
// if a is null then assign 0 to a and add a to the list
numbers.Add(a ??= 0);
Console.WriteLine((a is null)); // expected: false
Console.WriteLine(string.Join(" ", numbers)); // output: 5 0
Console.WriteLine(a); // output: 0
L’opérande gauche de l’opérateur ??=
doit être une variable, une propriétéou un élément d’indexeur.
Le type de l’opérande gauche des opérateurs ??
et ??=
ne peut pas être un type valeur non-nullable. En particulier, vous pouvez utiliser les opérateurs de coalescence nulle avec des paramètres de type non contraints :
private static void Display<T>(T a, T backup)
{
Console.WriteLine(a ?? backup);
}
Les opérateurs de coalescence nulle sont associatifs de droite. Autrement dit, des expressions du formulaire
a ?? b ?? c
d ??= e ??= f
sont évalués en tant que
a ?? (b ?? c)
d ??= (e ??= f)
Exemples
Les opérateurs ??
et ??=
peuvent être utiles dans les scénarios suivants :
Dans les expressions avec les opérateurs conditionnels null
?.
et?[]
, vous pouvez utiliser l’opérateur??
pour fournir une autre expression à évaluer si le résultat de l’expression avec des opérations conditionnelles null estnull
:double SumNumbers(List<double[]> setsOfNumbers, int indexOfSetToSum) { return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN; } var sum = SumNumbers(null, 0); Console.WriteLine(sum); // output: NaN
Lorsque vous utilisez des types valeur nullables et que vous devez fournir une valeur d’un type valeur sous-jacent, utilisez l’opérateur
??
pour spécifier la valeur à fournir au cas où une valeur de type nullable estnull
:int? a = null; int b = a ?? -1; Console.WriteLine(b); // output: -1
Utilisez la méthode Nullable<T>.GetValueOrDefault() si la valeur à utiliser quand une valeur de type Nullable est
null
doit être la valeur par défaut du type valeur sous-jacent.Vous pouvez utiliser une expression
throw
comme opérande droit de l’opérateur??
pour rendre le code de vérification des arguments plus concis :public string Name { get => name; set => name = value ?? throw new ArgumentNullException(nameof(value), "Name cannot be null"); }
L’exemple précédent montre également comment utiliser des membres expression-bodied pour définir une propriété.
Vous pouvez utiliser l’opérateur
??=
pour remplacer le code du formulaireif (variable is null) { variable = expression; }
par le code suivant :
variable ??= expression;
Capacité de surcharge de l’opérateur
Les opérateurs ??
et ??=
ne peuvent pas être surchargés.
spécification du langage C#
Pour plus d’informations sur l’opérateur ??
, consultez la section Opérateur de coalescence nulle de la spécification du langage C#.
Pour plus d’informations sur l’opérateur ??=
, consultez la note de proposition de fonctionnalité.