Как установить значение NULL DateTime для null в VB.NET?

Я пытаюсь настроить фильтр диапазона дат в моем пользовательском интерфейсе с помощью флажков, чтобы указать, должно ли использоваться значение DateTimePicker, например

Dim fromDate As DateTime? = If(fromDatePicker.Checked, fromDatePicker.Value, Nothing)

Однако установка fromDate в Nothing не приводит к тому, что она установлена ​​на Nothing, а на "12: 00: 00 AM", а следующий оператор If неправильно выполняет фильтр, потому что startDate не Nothing.

If (Not startDate Is Nothing) Then
    list = list.Where(Function(i) i.InvDate.Value >= startDate.Value)
End If

Как я действительно гарантирую startDate получает значение Nothing?

Ответ 1

Проблема в том, что сначала он рассматривает правую часть этого назначения и решает, что он имеет тип DateTime (no ?). Затем выполнение задания.

Это будет работать:

Dim fromDate As DateTime? = If(fromDatePicker.Checked, _
                               fromDatePicker.Value, _
                               CType(Nothing, DateTime?))

Потому что это заставляет правую сторону быть DateTime?.

Как я уже сказал в своем комментарии, Nothing может быть более сродни С# default(T), а не null:

Nothing представляет значение по умолчанию для типа данных. Значение по умолчанию зависит от того, имеет ли переменная тип значения или ссылочный тип.

Ответ 2

В дополнение к @Damien_The_Unbeliever прекрасный ответ, использование New DateTime? также работает:

Dim fromDate As DateTime? = If(fromDatePicker.Checked, _
                               fromDatePicker.Value, _
                               New DateTime?)

Вы можете обнаружить, что он выглядит немного интуитивно понятным, почему возможно CType(Nothing, DateTime?) предпочтительнее.

Ответ 3

С VB.NET и EF 6.X для сохранения null:

Dim nullableData As New Nullable(Of Date)

Ответ 4

Используйте New Date как магическое число:

Dim fromDate As New Date
If fromDatePicker.Checked Then
  fromDate = fromDatePicker.Value
End If
If fromDate <> New Date Then
  list = list.Where(Function(i) i.InvDate.Value >= fromDate.Value)
End If

Ответ 5

        squery = "insert into tblTest values('" & Me.txtCode.Text & "', @Date)"
        Dim cmd = New SqlCommand(squery, con)

        cmd.Parameters.Add("@Date", SqlDbType.DateTime)
        If txtRequireDate.Text = "" Then
            cmd.Parameters("@Date").Value = DBNull.Value
        Else
            cmd.Parameters("@Date").Value = txtRequireDate.Text
        End If