VB.NET - Обнуляемый DateTime и Тернарный Оператор - PullRequest
8 голосов
/ 16 ноября 2010

У меня проблемы с Nullable DateTime в VB.NET (VS 2010).

Метод 1

If String.IsNullOrEmpty(LastCalibrationDateTextBox.Text) Then
    gauge.LastCalibrationDate = Nothing
Else
    gauge.LastCalibrationDate = DateTime.Parse(LastCalibrationDateTextBox.Text)
End If

Метод 2

gauge.LastCalibrationDate = If(String.IsNullOrEmpty(LastCalibrationDateTextBox.Text), Nothing, DateTime.Parse(LastCalibrationDateTextBox.Text))

Когда задана пустая строка, метод 1 назначает нулевое значение (Nothing) для gauge.LastCalibrationDate, а метод 2 назначает ему DateTime.MinValue.

В других местах в моем коде у меня есть:

LastCalibrationDate = If(IsDBNull(dr("LastCalibrationDate")), Nothing, dr("LastCalibrationDate"))

Это правильно присваивает значение Null (Nothing) от тернарного оператора для Nullable DateTime.

Чего мне не хватает? Спасибо!

Ответы [ 2 ]

15 голосов
/ 16 ноября 2010

Боб Мак прав.Обратите особое внимание на его второе замечание - это не так в C #.

Что вам нужно сделать, это принудительно Nothing обнулить DateTime, применив его следующим образом:

gauge.LastCalibrationDate = If(String.IsNullOrEmpty(LastCalibrationDateTextBox.Text), CType(Nothing, DateTime?), DateTime.Parse(LastCalibrationDateTextBox.Text))

Вот фрагмент кода для демонстрации:

Dim myDate As DateTime?
' try with the empty string, then try with DateTime.Now.ToString '
Dim input = ""
myDate = If(String.IsNullOrEmpty(input), CType(Nothing, DateTime?), DateTime.Parse(input))
Console.WriteLine(myDate)

Вместо приведения вы также можете объявить новый обнуляемый: New Nullable(Of DateTime) или New DateTime?().Последний формат выглядит немного странно, но он действителен.

15 голосов
/ 16 ноября 2010

Я признаю, что я не эксперт в этом, но, очевидно, это происходит из двух вещей:

  1. Тернарный оператор If может возвращать только один тип, в данном случае датутип, не обнуляемый тип даты
  2. Значение VB.Net Nothing на самом деле не null, но эквивалентно значению по умолчанию указанного типа, в данном случае это дата, а не обнуляемая дата.Следовательно, минимальное значение даты.

Я получил большую часть информации для этого ответа из этого сообщения SO: Тернарный оператор VB против C #: почему разрешается в целое, а не целое число?

Надеюсь, что это поможет, и кто-то вроде Джоэла Кохорна сможет пролить больше света на эту тему.

...