2010-11-15 10 views
7

Tengo problemas con un DateTime de NULL en VB.NET (VS 2010).VB.NET - Operador de fecha y hora de Nullable Date

Método 1

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

Método 2

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

Cuando se le dé una cadena vacía Método 1 asigna un valor nulo (nada) a gauge.LastCalibrationDate pero Método 2 le asigna el DateTime.MinValue.

En otros lugares en mi código que tengo:

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

Esto asigna correctamente Null (Nada) de un operador ternario a un DateTime anulables.

¿Qué me estoy perdiendo? ¡Gracias!

Respuesta

13

tengo que admitir que no soy un experto en esto, pero parece que se debe a dos cosas:

  1. If El operador ternario puede devolver un solo tipo, en este caso un tipo de fecha, no una fecha de anulación tipo
  2. El valor de VB.Net Nothing no es realmente null pero es equivalente al valor predeterminado del tipo especificado, en este caso una fecha, no una fecha anulable. De ahí el valor mínimo de la fecha.

que derivan la mayor parte de la información de esta respuesta de este SO mensaje: Ternary operator VB vs C#: why resolves to integer and not integer?

Espero que esto ayude y que alguien como Joel Coehoorn puede arrojar más luz sobre el tema.

14

Bob Mc es correcto. Preste especial atención a su segundo punto: este no es el caso en C#.

Lo que hay que hacer es la fuerza Nothing a un DateTime anulable por colada de la siguiente manera:

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

Aquí hay un fragmento de demostrar:

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) 

En lugar de moldear también se puede declarar una nueva nullable: New Nullable(Of DateTime) o New DateTime?(). El último formato parece un poco extraño, pero es válido.

+2

+1 Buen trabajo, agregando la solución que producirá el resultado deseado. –