VB.NET - Nullable DateTime and Ternary Operator
Solution 1
I will admit that I'm not an expert on this, but apparently it stems from two things:
- The
If
ternary operator can return only one type, in this case a date type, not a nullable date type - The VB.Net
Nothing
value is not actuallynull
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.
Solution 2
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.
anonymous
Updated on July 09, 2022Comments
-
anonymous almost 2 years
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!
-
Bob Mc over 13 years+1 Nice job adding the workaround that will produce the desired result.