В C# 8.0 появился оператор присваивания с объединением нулей ?? =. Вы можете использовать оператор ?? = для присвоения значения его правого операнда его левому операнду, только если левый операнд имеет значение null. В C# 7.3 оператор объединения с нулем ?? также было несколько требований, которые теперь требуются в C # 8.0. Об этом мы тоже поговорим подробно.

Предпосылки

Чтобы использовать оператор присваивания Null-coalescing ?? =, вам необходимо настроить компьютер для запуска .NET Core, включая компилятор C # 8.0. Компилятор C # 8 доступен начиная с Visual Studio 2019 версии 16.3 или .NET Core 3.0 SDK.

Давайте начнем

Используйте объединяющий нуль оператор присваивания ?? =, чтобы присвоить значение правого операнда левому операнду, только если значение левого операнда равно нулю.
Например, в приведенном ниже коде я инициализирую список типа int с именем «numbers» нулевой ссылкой. Затем я использую оператор присваивания Null-coalescing, чтобы назначить новый List из int, если значение «numbers» равно нулю.


    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  

В предыдущих версиях C #, таких как 7.3, мы использовали другие различные методы для выполнения той же задачи, что и оператор присваивания с объединением нулей ??. Например, я использую оператор Null-coalescing, чтобы сделать то же самое, но это кажется немного дешевым.


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

Обновленные требования к оператору слияния нуля

В C# 7.3 и ранее тип левого операнда оператора ?? Оператор должен быть либо ссылочным типом, либо типом значения, допускающим значение NULL. Начиная с C# 8.0, это требование заменяется следующим: тип левого операнда оператора ?? Операторы и ?? = не могут быть типом значения, не допускающим значения NULL. Например:


    int? number = null;  
    number =number?? 0;  

В частности, начиная с C# 8.0, вы можете использовать операторы объединения с нулевым значением с параметрами неограниченного типа. Например, я использую оператор объединения NULL с типом, не допускающим значения NULL, и он выдает ошибку.


    int number = 5;  
    number = number ?? 0;  

Итак, когда я попытался построить это. Выдает ошибку:

Ошибка CS0019 Оператор ‘??’ не может применяться к операндам типа int и int