2010-11-15 34 views
7

Je rencontre des problèmes avec un DateTime Nullable dans VB.NET (VS 2010).VB.NET - Opérateur DateTime et ternaire Nullable

Méthode 1

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

Méthode 2

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

Lorsque donné une chaîne vide Méthode 1 attribue un Null (Nothing) de la valeur à gauge.LastCalibrationDate mais Méthode 2 lui attribue la DateTime.MinValue.

Dans d'autres endroits dans mon code que j'ai:

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

Cet correctement attribue Null (Nothing) d'un opérateur à un ternaires Nullable DateTime.

Qu'est-ce qui me manque? Merci!

Répondre

13

Je dois admettre que je ne suis pas un expert en la matière, mais apparemment il découle de deux choses:

  1. L'opérateur ternaire If peut retourner un seul type, dans ce cas, un type de date, pas date nullable type
  2. La valeur VB.Net Nothing n'est pas réellement null mais est équivalente à la valeur par défaut du type spécifié, dans ce cas une date et non une date Nullable. D'où la valeur minimale de date.

Je dérivé la plupart des informations de cette réponse de ce SO message: Ternary operator VB vs C#: why resolves to integer and not integer?

Hope this helps et que quelqu'un comme Joel Coehoorn peut jeter plus de lumière sur le sujet.

14

Bob Mc est correct. Portez une attention particulière à son deuxième point - ce n'est pas le cas en C#.

Ce que vous devez faire est la force Nothing à un DateTime nullable par coulée comme suit:

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

Voici un extrait de démontrer:

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) 

lieu de jeter, vous pouvez également déclarer une nouvelle valeur Null: New Nullable(Of DateTime) ou New DateTime?(). Le dernier format semble un peu étrange mais c'est valide.

+2

+1 Beau travail ajoutant la solution qui produira le résultat souhaité. –