Почему условный оператор правильно разрешает использование «null» для присваивания типам с нулевым значением?

Возможные дубликаты:
Неверные типы и тернарный оператор. Почему это не будет работать?
Условное назначение оператора с нулевыми типами ?

Это не будет компилироваться, заявив: «Тип условного выражения не может быть определен, потому что нет никакого неявного преобразования между« System.DateTime »и« »

task.ActualEndDate = TextBoxActualEndDate.Text != "" ? DateTime.Parse(TextBoxActualEndDate.Text) : null; 

Это прекрасно работает

  if (TextBoxActualEndDate.Text != "") task.ActualEndDate = DateTime.Parse(TextBoxActualEndDate.Text); else task.ActualEndDate = null; 

Это не работает, потому что компилятор не будет вставлять неявное преобразование с обеих сторон одновременно, а null требует, чтобы неявное преобразование стало типом с null значением.

Вместо этого вы можете написать

 task.ActualEndDate = TextBoxActualEndDate.Text != "" ? DateTime.Parse(TextBoxActualEndDate.Text) : new DateTime?(); 

Для этого требуется только одно неявное преобразование ( DateTime to DateTime? ).

Кроме того, вы можете использовать любую левую сторону:

 task.ActualEndDate = TextBoxActualEndDate.Text != "" ? (DateTime?)DateTime.Parse(TextBoxActualEndDate.Text) : null; 

Для этого также требуется только одно неявное преобразование.

Условный оператор не смотрит, на что возвращается значение. Он просматривает только те значения, которые задают между: DateTime и null. Он не может идентифицировать их как экземпляры того же типа (поскольку null не является допустимым DateTime), следовательно, ошибка. Мы с вами знаем, что Nullable мог выполнять задание, но условному оператору не разрешено вводить «более крупные» типы: разрешено смотреть только на типы двух выражений, которые он выбирает между ними. (Спасибо Ароноуну в комментариях за разъяснение этого момента и хороший поясняющий пример.)

Чтобы обойти это, дайте оператору подсказку, выставив DateTime:

 TextBoxActualEndDate.Text != "" ? (DateTime?)(DateTime.Parse(TextBoxActualEndDate.Text)) : null; ^^^^^^^^^^^ 

Это дубликат

Неверные типы и тернарный оператор: почему? 10: null` запрещено?

Мой ответ на

Условный оператор не может действовать неявно?

дает анализ, соответствующий этому вопросу.

Я также буду вести блог о подобной проблеме с условным оператором в апреле; смотрите блог для подробностей.

Причина в том, что null имеет object типа, поэтому вам нужно отдать его правильному типу, например:

 task.ActualEndDate = TextBoxActualEndDate.Text != "" ? DateTime.Parse(TextBoxActualEndDate.Text) : ((DateTime?) null); 

Самый правильный способ (ИМО) – сделать это

 task.ActualEndDate = TextBoxActualEndDate.Text != "" ? (DateTime?)(DateTime.Parse(TextBoxActualEndDate.Text) : null); 

Таким образом, я использую оператор нулевого коллайзера.

Вероятно, это ошибка, которую вы получаете в этой ситуации:

error CS0173: Тип условного выражения не может быть определен, потому что нет никакого неявного преобразования между ” и ‘int’)

Компилятор объясняет, что он не знает, как преобразовать null в DateTime .


Fix:

вам нужно explicitly expression которое может возвращать значение null в тип с null nullable . Это будет работать

 ((DateTime?) null);