Я только что проверил этот код и увидел то же поведение, которое вы описываете:
Option Strict Off
Module Module1
Sub Main()
Dim nullableDate As Date? = Nothing
Dim boxedNullableDate As Object = nullableDate
Console.WriteLine(boxedNullableDate.HasValue)
Console.ReadLine()
End Sub
End Module
Причиной исключения будет то, что бокс Date?
, который не имеет значения, дает вам ссылку Object
, равную Nothing
, и при попытке получить доступ к любому члену Nothing
выдает NullReferenceException
.
Это в основном означает, что позднее связывание с типами значений, которые могут иметь значение NULL, просто не будет работать.
EDIT:
Интересно, я просто изменил код на это:
Option Strict Off
Module Module1
Sub Main()
Dim nullableDate As Date? = Date.Now
Dim boxedNullableDate As Object = nullableDate
Console.WriteLine(boxedNullableDate.HasValue)
Console.ReadLine()
End Sub
End Module
и теперь я получаю MissingMemberException
с сообщением:
Открытый член 'HasValue' для типа 'Дата' не найден.
Похоже, что в боксе с типом значения, допускающим значение NULL, не сохраняются сведения о том, что исходная переменная была NULL. Отладчик просто распознает переменную Object
как только Object
, если она Nothing
, в противном случае Object {Date}
.