Подтвердить что ты не робот

Почему я не могу установить nullable int в null в трехмерном выражении if?

Код С# ниже:

int? i;
i = (true ? null : 0);

дает мне ошибку:

Тип условного выражения не может определяться, потому что нет неявное преобразование между '<null> ' и 'int'

Должно ли это быть действительным? Что мне здесь не хватает?

4b9b3361

Ответ 1

Компилятор пытается оценить правильное выражение. null - null, а 0 - литерал int, а не int?. Компилятор пытается сказать вам, что он не может определить, какой тип выражение должно оценивать как. Там нет неявного преобразования между null и int, следовательно, сообщение об ошибке.

Вам нужно сообщить компилятору, что выражение должно оцениваться как int?. Существует неявное преобразование между int? и int, или между null и int?, поэтому любой из них должен работать:

int? x = true ? (int?)null : 0;

int? y = true ? null : (int?)0;

Ответ 2

Для работы с тройными операторами необходимо использовать ключевое слово default(), а не null.

Пример:

int? i = (true ? default(int?) : 0);

В качестве альтернативы вы можете просто указать нуль:

int? i = (true ? (int?)null : 0);

Лично я придерживаюсь обозначения default(), это просто предпочтение, действительно. Но в конечном итоге вы должны придерживаться только одной конкретной нотации, ИМХО.

НТН!

Ответ 3

Часть (true ? null : 0) становится функцией в некотором смысле. Эта функция требует типа возврата. Когда компилятор должен выяснить тип возврата, он не может.

Это работает:

int? i;
i = (true ? null : (int?)0);