Почему присваивание с нулевым оператором объединения не компилируется? [дубликат]C#

Место общения программистов C#
Anonymous
Почему присваивание с нулевым оператором объединения не компилируется? [дубликат]

Сообщение Anonymous »

Я ожидал, что это задание сработает. Это не так.

Код: Выделить всё

public class Foo {}

public class Bar {}

internal class Program
{
static void Main(string[] args)
{
Foo? foo = null;
Bar? bar = new Bar();
object? val = foo ?? bar;  // FAIL: Compiler error CS0019
}
}
Компилятору не нравится последняя строка. Жалуется на эту ошибку
ошибка CS0019: Оператор '??' нельзя применить к операндам типа «Foo» и «Bar»
Но я объявил Foo? и Bar?, которые оба могут быть назначены переменная типа объект?. Если я изменю его на использование оператора if и четырех строк, все будет работать нормально.

Код: Выделить всё

        object? val = default;

if (foo != null)
val = foo;
else
val = bar;
И в конце концов я обнаружил, что если я поставлю явное приведение к (object?) перед левой частью, оно скомпилируется в одну строку

Код: Выделить всё

    object? val = (object?)foo ?? bar;  // THIS COMPILES
Но всё же хочу понять: Почему не работает первая версия? Может ли компилятор не найти между ними общий тип, допускающий значение NULL?

Подробнее здесь: https://stackoverflow.com/questions/790 ... ot-compile

Вернуться в «C#»