Ошибка доступа к .HasValue для переменной DateTime с нулевым значением - PullRequest
0 голосов
/ 28 июня 2018

Я получаю следующую ошибку при доступе к свойству .HasValue переменной DateTime? со значением NULL (если оно не имеет значения).

Он отлично работает на моей машине для разработки (Win 10, VS 2017), но после сборки по определению сборки TFS v15.117 (для использования версии VS 2017) и опубликован на сервере клиента (Windows Server 2012 R2 Стандарт), выдается следующая ошибка:

[NullReferenceException: переменная объекта или переменная блока не набор.] Microsoft.VisualBasic.CompilerServices.Container..ctor (Object Экземпляр) + 1479606
Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet (Объект Экземпляр, Тип Тип, Строка MemberName, Объект [] Аргументы, Строка [] ArgumentNames, Type [] TypeArguments, Boolean [] CopyBack) + 250

Почему myDateTimeVar.HasValue работает в одной системе, но не работает, как эта, в другой?

EDIT:

Dim testDate1 As DateTime? = Nothing
Dim testDate2 As DateTime? = DateTime.Now
Dim testDate3 As DateTime? = DateTime.MinValue
Dim testDate4 As DateTime?
Debug.WriteLine(testDate1.HasValue) 'False
Debug.WriteLine(testDate2.HasValue) 'True
Debug.WriteLine(testDate3.HasValue) 'True
Debug.WriteLine(testDate4.HasValue) 'False

[На основе обсуждения в комментариях к ответу J] Этот код отлично работает в проекте локально. Как вы думаете, применяется ли Option Strict по-разному в разных конфигурациях / средах? (Хотя для TFS Build Def было установлено использование Debug)

1 Ответ

0 голосов
/ 28 июня 2018

Я только что проверил этот код и увидел то же поведение, которое вы описываете:

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}.

...