Это сводится к тому, что компилятору необходимо выполнить анализ типов для If
. Имейте в виду, что Nothing
– это не то же самое, что значение NULL в C#, оно ближе до default(T)
:
Если переменная имеет тип значения, который не допускает значение NULL, присвоение ей Nothing устанавливает для нее значение по умолчанию для объявленного типа.
Теперь, когда компилятор анализирует If
, он должен определить тип всего выражения. Вот на что он смотрит:
If(Boolean,<AnyType>,DateTime)
Теперь он должен решить, какой тип выражения, на основе типов второго и третьего параметров, и он должен выбрать один из имеющихся типов. Так что, вполне естественно, он выбирает DateTime
. И Nothing
, преобразованное в DateTime
, совпадает с минимальным значением.
Чтобы изменить это, дайте выбор вывести тип как DateTime?
вместо этого:
mydate = If(dtReader.IsDBNull(dtReader.GetOrdinal("mydate")), _
CType(Nothing,DateTime?), _
dtReader.GetDateTime(dtReader.GetOrdinal("mydate")))
Согласно Спецификации языка Visual Basic, раздел 11.22 (Условное Выражения):
Если предоставлены три операнда, все три выражения должны быть классифицированы как значения, а первый операнд должен быть логическим выражением. Если результат выражения истинен, то результатом оператора будет второе выражение, иначе результатом оператора будет третье выражение. Тип результата выражения является доминирующим между типами второго и третьего выражений. Если нет доминирующего типа, возникает ошибка времени компиляции.
(Мой акцент).
И обратите внимание, что нет условного текста о том, что «если это используется в операторе присваивания, вы также можете принять во внимание объявленный тип присваиваемой переменной».
person
Damien_The_Unbeliever
schedule
09.12.2015