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