?? I?? = operatory (odwołanie w C#)

Operator scalania wartości null zwraca wartość swojego operandu po lewej stronie, jeśli nie jest; w przeciwnym razie oblicza operand po prawej stronie i ?? null zwraca swój wynik. Operator nie ocenia swojego operandu po prawej stronie, jeśli operand po lewej stronie zwraca ?? wartość niezerową.

Dostępny w języku C# 8.0 lub nowszym operator przypisania, który jest scalony z wartością null, przypisuje wartość swojego operandu po prawej stronie do swojego operandu po lewej stronie tylko wtedy, gdy operand po lewej stronie zwraca wartość ??= null . Operator nie ocenia swojego operandu po prawej stronie, jeśli operand po lewej stronie zwraca ??= wartość niezerową.

List<int> numbers = null;
int? a = null;

(numbers ??= new List<int>()).Add(5);
Console.WriteLine(string.Join(" ", numbers));  // output: 5

numbers.Add(a ??= 0);
Console.WriteLine(string.Join(" ", numbers));  // output: 5 0
Console.WriteLine(a);  // output: 0

Operand po lewej stronie ??= operatora musi być zmienną, właściwością lub elementem indeksatora.

W języku C# 7.3 lub wcześniejszym typ operandu po lewej stronie operatora musi być typem referencyjnym lub typem wartości ?? dopuszczania wartości null . Począwszy od języka C# 8.0, to wymaganie jest zastępowane następującym: typ operandu po lewej stronie operatorów i nie może być typem wartości nienadajnym ?? ??= do wartości null. W szczególności, począwszy od języka C# 8.0, można używać operatorów niepowiązywających wartości null z niezauczonymi parametrami typu:

private static void Display<T>(T a, T backup)
{
    Console.WriteLine(a ?? backup);
}

Operatory kojarzenia wartości null są asocjacyjne po prawej stronie. Oznacza to, że wyrażenia formularza

a ?? b ?? c
d ??= e ??= f

są oceniane jako

a ?? (b ?? c)
d ??= (e ??= f)

Przykłady

Operatory ?? i mogą być przydatne w następujących ??= scenariuszach:

  • W wyrażeniach z operatorami warunkowym null ?. i ?[]można użyć operatora , aby podać alternatywne wyrażenie do oceny w przypadku, gdy wynikiem wyrażenia z operacjami warunkowym o wartości ?? null jest null :

    double SumNumbers(List<double[]> setsOfNumbers, int indexOfSetToSum)
    {
        return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN;
    }
    
    var sum = SumNumbers(null, 0);
    Console.WriteLine(sum);  // output: NaN
    
  • W przypadku pracy z typami wartości dopuszczania wartości null i konieczności podania wartości typu wartości bazowej użyj operatora , aby określić wartość, która ma być dostarczana na wypadek, gdy wartość typu dopuszcza wartość ?? null null:

    int? a = null;
    int b = a ?? -1;
    Console.WriteLine(b);  // output: -1
    

    Użyj metody , jeśli wartość, która ma być używana, gdy typem dopuszczanym do wartości null powinna być wartość domyślna Nullable<T>.GetValueOrDefault() null bazowego typu wartości.

  • Począwszy od języka C# 7.0, można użyć wyrażenia jako operandu po prawej stronie operatora, aby kod sprawdzania throw ?? argumentów był bardziej zwięzły:

    public string Name
    {
        get => name;
        set => name = value ?? throw new ArgumentNullException(nameof(value), "Name cannot be null");
    }
    

    W poprzednim przykładzie pokazano również sposób definiowania właściwości przy użyciu elementów członkowskich z wyrażeniem w treści.

  • Począwszy od języka C# 8.0, można użyć operatora , ??= aby zastąpić kod formularza

    if (variable is null)
    {
        variable = expression;
    }
    

    za pomocą następującego kodu:

    variable ??= expression;
    

Przeciążanie operatorów

Operatory ?? i nie mogą być ??= przeciążone.

specyfikacja języka C#

Aby uzyskać więcej informacji na temat operatora , zobacz sekcję operatora ujednania wartości ?? null w specyfikacji języka C#.

Aby uzyskać więcej informacji na ??= temat operatora, zobacz uwagi dotyczące propozycji funkcji.

Zobacz też