Почему я не могу установить nullable int в null в трехмерном выражении if?
Код С# ниже:
int? i;
i = (true ? null : 0);
дает мне ошибку:
Тип условного выражения не может определяться, потому что нет неявное преобразование между '<null> ' и 'int'
Должно ли это быть действительным? Что мне здесь не хватает?
Ответ 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) становится функцией в некотором смысле. Эта функция требует типа возврата. Когда компилятор должен выяснить тип возврата, он не может.