В 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» равно нулю.

[pastacode lang=»c» manual=»%0A%20%20%20%20List%3Cint%3E%20numbers%20%3D%20null%3B%20%20%0A%20%20%20%20int%3F%20a%20%3D%20null%3B%20%20%0A%20%20%20%20%20%20%0A%20%20%20%20(numbers%20%3F%3F%3D%20new%20List%3Cint%3E()).Add(5)%3B%20%20%0A%20%20%20%20Console.WriteLine(string.Join(%22%20%22%2C%20numbers))%3B%20%20%2F%2F%20output%3A%205%20%20%0A%20%20%20%20%20%20%0A%20%20%20%20numbers.Add(a%20%3F%3F%3D%200)%3B%20%20%0A%20%20%20%20Console.WriteLine(string.Join(%22%20%22%2C%20numbers))%3B%20%20%2F%2F%20output%3A%205%200%20%20%0A%20%20%20%20Console.WriteLine(a)%3B%20%20%2F%2F%20output%3A%200%20%20%0A» message=»» highlight=»» provider=»manual»/]

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

[pastacode lang=»c» manual=»%0A%20%20%20%20List%3Cint%3E%20numbers%20%3D%20null%3B%20%20%0A%20%20%20%20int%3F%20a%20%3D%20null%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20(numbers%20%3D%20numbers%20%3F%3F%20new%20List%3Cint%3E()).Add(5)%3B%20%20%0A%20%20%20%20Console.WriteLine(string.Join(%22%20%22%2C%20numbers))%3B%20%20%2F%2F%20output%3A%205%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20numbers.Add((a%3Da%3F%3F0).Value)%3B%20%20%0A%20%20%20%20Console.WriteLine(string.Join(%22%20%22%2C%20numbers))%3B%20%20%2F%2F%20output%3A%205%200%20%20%0A%20%20%20%20Console.WriteLine(a)%3B%20%20%2F%2F%20output%3A%200%20%20%0A» message=»» highlight=»» provider=»manual»/]

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

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

[pastacode lang=»c» manual=»%0A%20%20%20%20int%3F%20number%20%3D%20null%3B%20%20%0A%20%20%20%20number%20%3Dnumber%3F%3F%200%3B%20%20%0A» message=»» highlight=»» provider=»manual»/]

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

[pastacode lang=»c» manual=»%0A%20%20%20%20int%20number%20%3D%205%3B%20%20%0A%20%20%20%20number%20%3D%20number%20%3F%3F%200%3B%20%20%0A» message=»» highlight=»» provider=»manual»/]

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

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