Почему условный оператор правильно не позволяет использование “пустого указателя” для присвоения на nullable типы? [дубликат]

8
задан Community 23 May 2017 в 12:03
поделиться

6 ответов

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

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

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

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

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

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

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

8
ответ дан 5 December 2019 в 12:57
поделиться

Это дубликат

типов, допускающих значение NULL, и тернарного оператора: почему `? 10: null` запрещено?

Мой ответ на

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

дает анализ, который имеет отношение к этому вопросу.

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

1
ответ дан 5 December 2019 в 12:57
поделиться

Это ошибка, которая, вероятно, возникает в этой ситуации:

ошибка CS0173: Тип условного выражения не может быть определен , поскольку не существует неявного преобразования между '' и 'int')

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


Исправление:

необходимо привести явно к выражению , которое может вернуть null в тип nullable . . Это будет работать

((DateTime?) null);
0
ответ дан 5 December 2019 в 12:57
поделиться

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

task.ActualEndDate = TextBoxActualEndDate.Text != "" ? 
    DateTime.Parse(TextBoxActualEndDate.Text) : ((DateTime?) null);
0
ответ дан 5 December 2019 в 12:57
поделиться

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

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

TextBoxActualEndDate.Text != "" ? (DateTime?)(DateTime.Parse(TextBoxActualEndDate.Text)) : null;
                                  ^^^^^^^^^^^
4
ответ дан 5 December 2019 в 12:57
поделиться

Наиболее правильным способом (IMO) является выполнение этого

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

Я часто использую оператор null collaescing таким образом.

0
ответ дан 5 December 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: