Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
L'operatore ?? null-coalescing restituisce il valore dell'operando sinistro se non nullè . In caso contrario, valuta l'operando di destra e ne restituisce il risultato. L'operatore ?? non valuta l'operando di destra se l'operando di sinistra restituisce un valore diverso da Null. L'operatore ??= di assegnazione null-coalescing assegna il valore dell'operando di destra al relativo operando di sinistra solo se l'operando di sinistra restituisce null. L'operatore ??= non valuta l'operando di destra se l'operando di sinistra restituisce un valore diverso da 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'operando sinistro dell'operatore ??= deve essere una variabile, una proprietà o un elemento dell'indicizzatore .
Il riferimento al linguaggio C# documenta la versione rilasciata più di recente del linguaggio C#. Contiene anche la documentazione iniziale per le funzionalità nelle versioni di anteprima pubblica per la prossima versione del linguaggio di programmazione.
La documentazione identifica tutte le funzionalità introdotte nelle ultime tre versioni della lingua o nelle anteprime pubbliche correnti.
Suggerimento
Per trovare quando una funzionalità è stata introdotta per la prima volta in C#, vedere l'articolo sulla cronologia delle versioni del linguaggio C#.
Il tipo dell'operando sinistro degli operatori ?? e ??= non può essere un tipo di valore non annullabile. In particolare, è possibile usare gli operatori null-coalescing con parametri di tipo non vincolato:
private static void Display<T>(T a, T backup)
{
Console.WriteLine(a ?? backup);
}
Gli operatori null-coalescing sono destro-associativi. Cioè, espressioni della forma
a ?? b ?? c
d ??= e ??= f
vengono valutati come
a ?? (b ?? c)
d ??= (e ??= f)
Esempi
Gli ?? operatori e ??= sono utili negli scenari seguenti:
Nelle espressioni che usano gli operatori
?.condizionali Null e?[], usare l'operatore??per fornire un'espressione alternativa per valutare se il risultato dell'espressione con operazioni condizionali null ènull:double SumNumbers(List<double[]> setsOfNumbers, int indexOfSetToSum) { return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN; } var sum = SumNumbers(null, 0); Console.WriteLine(sum); // output: NaNQuando si usano tipi valore nullable ed è necessario specificare un valore di un tipo valore sottostante, usare l'operatore
??per specificare il valore da specificare se un valore di tipo nullable ènull:int? a = null; int b = a ?? -1; Console.WriteLine(b); // output: -1Utilizzare il Nullable<T>.GetValueOrDefault() metodo se il valore da usare quando un valore di tipo nullable deve
nullessere il valore predefinito del tipo di valore sottostante.Per rendere il codice di controllo degli argomenti più conciso, usare un'espressione
throwcome operando di destra dell'operatore??:public string Name { get => name; set => name = value ?? throw new ArgumentNullException(nameof(value), "Name cannot be null"); }Nell'esempio precedente viene inoltre illustrato come usare membri con corpo di espressione per definire una proprietà.
Usare l'operatore
??=per sostituire il codice del formato seguente:if (variable is null) { variable = expression; }Usare il codice seguente:
variable ??= expression;
Sovraccarico degli operatori
Non è possibile eseguire l'overload degli ?? operatori e ??= .
Specifiche del linguaggio C#
Per altre informazioni sull'operatore ?? , vedere la sezione Operatore di unione Null della specifica del linguaggio C#.
Per altre informazioni sull'operatore ??= , vedere la sezione Assegnazione composta della specifica del linguaggio C#.