vb.net - type - visual studio versions




Come posso impostare un valore DateTime nullable su null in VB.NET? (4)

Sto provando a impostare un filtro dell'intervallo di date sull'interfaccia utente, con le caselle di controllo per indicare se è necessario utilizzare il valore di DateTimePicker, ad esempio

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

Tuttavia, l'impostazione da fromDate a Nothing non comporta l'impostazione su Nothing ma su "12: 00: 00 AM" e la seguente istruzione If esegue in modo errato il filtro perché startDate non è Nothing .

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

Come posso davvero garantire che startDate abbia un valore di Nothing ?


Il problema è che sta esaminando per prima cosa il lato destro di questo compito e decidendo che è di tipo DateTime (no ? ). Quindi esegui il compito.

Questo funzionerà:

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

Perché impone che il tipo della parte destra sia DateTime? .

Come ho detto nel mio commento, Nothing può essere più simile al default(T) di C # default(T) piuttosto che a null :

Nothing rappresenta il valore predefinito di un tipo di dati. Il valore predefinito dipende dal fatto che la variabile sia di un tipo di valore o di un tipo di riferimento.


Usa New Date come numero magico:

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

Con VB.NET e EF 6.X per salvare null è:

Dim nullableData As New Nullable(Of Date)


Oltre alla bella risposta di @ Damien_The_Unbeliever, usando New DateTime? funziona anche:

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

Potresti scoprire che sembra un po 'contro-intuitivo, perché forse è preferibile il CType(Nothing, DateTime?) .







vb.net-2010