Может кто-нибудь объяснить, почему это работает в C # .NET 2.0:
Nullable<DateTime> foo;
if (true)
foo = null;
else
foo = new DateTime(0);
... но это не так:
Nullable<DateTime> foo;
foo = true ? null : new DateTime(0);
Последняя форма дает мне ошибку компиляции: «Тип условного выражения не может быть определен, поскольку не существует неявного преобразования между« <null> »и« System.DateTime ».»
Не то, чтобы я не мог использовать первый, но второй стиль более соответствует остальной части моего кода.
c#
generics
nullable
conditional-operator
Ник Готч
источник
источник
Ответы:
Этот вопрос уже задавался несколько раз. Компилятор говорит вам, что он не знает, как конвертировать
null
вDateTime
.Решение простое:
Обратите внимание, что
Nullable<DateTime>
можно написать,DateTime?
что сэкономит вам кучу печатать.источник
<null>
иDateTime
вместо того, чтобы найти общий тип предка, он просто пытается найти преобразование между собой. (Дополнительный бит: C # распознает<null>
тип, то есть тип каждогоnull
выражения.)К вашему сведению (оффтоп, но изящный и относящийся к обнуляемым типам) у нас есть удобный оператор только для обнуляемых типов, называемый оператором слияния нуль
Используется так:
источник
Это связано с тем, что в тернарном операторе два значения должны разрешаться в один и тот же тип.
источник
Я знаю, что этот вопрос задавался в 2008 году, а сейчас - 5 лет спустя, но ответ, помеченный как ответ, меня не удовлетворяет. Реальный ответ заключается в том, что DateTime является структурой, и как структура она не совместима с нулем. У вас есть два пути решения этого:
Во-первых, сделать NULL совместимым с DateTime (например, привести NULL к DateTime?, Как предполагает джентльмен с 70 голосами вверх, или NULL для Object или ValueType).
Второе - сделать DateTime совместимым с нулевым значением (например, приведение DateTime к DateTime?).
источник
Другое решение, подобное принятому, заключается в использовании
default
ключевого слова C # . Хотя он определен с использованием обобщений, он фактически применим к любому типу.Пример использования, примененный к вопросу ОП:
Пример использования с текущим принятым ответом:
Кроме того, используя
default
, вам не нужно указывать переменную какnullable
для того, чтобы присвоить ейnull
значение. Компилятор автоматически назначит значение по умолчанию для определенного типа переменной, и ошибки не возникнет. Пример:источник
default(DateTime)
не ноль, это "1.1.0001 0:00:00
", так же, какnew DateTime(0)
.null
, только то, что с помощьюdefault()
него можно присвоитьnullable
значение (как указано в MSDN). Примеры я показываю продемонстрировать универсальность , что он может быть использован сNullable<DateTime>
,DateTime?
и простоDateTime
. Если вы считаете, что это неверно, можете ли вы предоставить PoC, если это не помогло?null
в переменной, нетdefault(DateTime)
, так что это в лучшем случае вводит в заблуждение. Это не «универсальный» , как вы подразумеваете, так как выражение в целом имеет все тот же тип -DateTime
и вы можете заменитьdefault(DateTime)
с ,new DateTime()
и он будет делать то же самое. Может быть,default(DateTime?)
это то, что вы имели в виду, так как это на самом деле равноnull
.