Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

VB.NET - Nullable DateTime and Ternary Operator

I'm having problems with a Nullable DateTime in VB.NET (VS 2010).

Method 1

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

Method 2

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

When given an empty string Method 1 assigns a Null (Nothing) value to gauge.LastCalibrationDate but Method 2 assigns it the DateTime.MinValue.

In other places in my code I have:

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

This correctly assigns Null (Nothing) from a Ternary Operator to a Nullable DateTime.

What am I missing? Thanks!

like image 264
anonymous Avatar asked Nov 15 '10 23:11

anonymous


2 Answers

Bob Mc is correct. Pay extra attention to his second point - this isn't the case in C#.

What you need to do is force Nothing to a nullable DateTime by casting it as follows:

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

Here is a snippet to demonstrate:

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)

Instead of casting you can also declare a new nullable: New Nullable(Of DateTime) or New DateTime?(). The latter format looks a little odd but it's valid.

like image 91
Ahmad Mageed Avatar answered Nov 13 '22 21:11

Ahmad Mageed


I will admit that I'm not an expert on this, but apparently it stems from two things:

  1. The If ternary operator can return only one type, in this case a date type, not a nullable date type
  2. The VB.Net Nothing value is not actually null but is equivalent to the default value of the specified type, in this case a date, not a nullable date. Hence the date minimum value.

I derived most of the information for this answer from this SO post: Ternary operator VB vs C#: why resolves to integer and not integer?

Hope this helps and that someone like Joel Coehoorn can shed more light on the subject.

like image 34
Bob Mc Avatar answered Nov 13 '22 21:11

Bob Mc