2010-11-15 20 views
7

Mam problemy z Nullable DateTime w VB.NET (VS.NET).VB.NET - Nullyble DateTime and Ternary Operator

Metoda 1

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

Metoda 2

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

Kiedy podano pusty ciąg Metoda 1 przypisuje Null (Nic) Wartość gauge.LastCalibrationDate ale Metoda 2 przypisuje go DateTime.MinValue.

W innych miejscach w moim kodu mam:

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

to poprawnie przypisuje Null (nic) z potrójnego Operatora do pustych DateTime.

Czego mi brakuje? Dzięki!

Odpowiedz

13

Muszę przyznać, że nie jestem ekspertem w tej sprawie, ale najwyraźniej to wynika z dwóch rzeczy:

  1. If operator trójargumentowy może wrócić tylko jednego typu, w tym przypadku typ daty, a nie zerowalna data typ
  2. Wartość VB.Net Nothing nie jest w rzeczywistości null, ale jest odpowiednikiem wartości domyślnej określonego typu, w tym przypadku daty, a nie daty zerowej. Stąd data minimalna wartość.

I pochodzi większość informacji o tej odpowiedzi z tym SO post: Ternary operator VB vs C#: why resolves to integer and not integer?

nadzieję, że to pomoże i że ktoś taki jak Joel Coehoorn może rzucić więcej światła na ten temat.

14

Bob Mc ma rację. Zwróć szczególną uwagę na jego drugą kwestię - tak nie jest w C#.

Co trzeba zrobić, to siła Nothing do wartości pustych DateTime oddając go w następujący sposób:

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

Oto urywek wykazać:

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) 

Zamiast odlewania można również zadeklarować nowy zerowy: New Nullable(Of DateTime) lub New DateTime?(). Ten drugi format wygląda trochę dziwnie, ale jest ważny.

+2

+1 Dobra robota, dodając obejście, które przyniesie pożądany rezultat. –