Это не работает, потому что компилятор не будет вставлять неявное преобразование сразу с обеих сторон, а null
требует, чтобы неявное преобразование стало типом, допускающим значение NULL.
Вместо этого вы можете написать
task.ActualEndDate = TextBoxActualEndDate.Text != "" ?
DateTime.Parse(TextBoxActualEndDate.Text) : new DateTime?();
Для этого требуется только одно неявное преобразование ( DateTime
в DateTime?
).
В качестве альтернативы вы можете привести любое левое значение:
task.ActualEndDate = TextBoxActualEndDate.Text != "" ?
(DateTime?)DateTime.Parse(TextBoxActualEndDate.Text) : null;
Это также требует только одного неявного преобразования.
Это дубликат
типов, допускающих значение NULL, и тернарного оператора: почему `? 10: null` запрещено?
Мой ответ на
Условный оператор не может приводить неявно?
дает анализ, который имеет отношение к этому вопросу.
Я также буду писать в блоге о подобной проблеме с условным оператором в апреле; подробности смотрите в блоге.
Это ошибка, которая, вероятно, возникает в этой ситуации:
ошибка CS0173: Тип условного выражения не может быть определен , поскольку не существует неявного преобразования между '' и 'int')
Компилятор объясняет, что он не знает, как преобразовать null
в DateTime
.
Исправление:
необходимо привести
явно
к выражению
, которое может вернуть null
в тип nullable
. . Это будет работать
((DateTime?) null);
Причина в том, что null имеет тип object
, поэтому вы должны привести его к правильному типу, например:
task.ActualEndDate = TextBoxActualEndDate.Text != "" ?
DateTime.Parse(TextBoxActualEndDate.Text) : ((DateTime?) null);
Условный оператор не смотрит на то, во что возвращается значение. Он смотрит только на значения, между которые ему предлагается выбрать: DateTime и null. Он не может идентифицировать их как экземпляры одного типа (потому что null не является допустимым DateTime), отсюда и ошибка. Мы с вами знаем, что Nullable
может выполнить эту работу, но условному оператору не разрешается вводить «большие» типы: ему разрешено смотреть только на типы двух выражений, между которыми он выбирает. (Спасибо Aaronaught в комментариях за разъяснение этого момента и хороший уточняющий пример.)
Чтобы обойти эту сторону, дайте оператору подсказку, приведя DateTime:
TextBoxActualEndDate.Text != "" ? (DateTime?)(DateTime.Parse(TextBoxActualEndDate.Text)) : null;
^^^^^^^^^^^
Наиболее правильным способом (IMO) является выполнение этого
task.ActualEndDate = TextBoxActualEndDate.Text != "" ?
(DateTime?)(DateTime.Parse(TextBoxActualEndDate.Text) : null);
Я часто использую оператор null collaescing таким образом.