VB.NET - Nullable DateTime and Ternary Operator
I'm having problems with a Nullable DateTime in V开发者_运维知识库B.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!
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.
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.
精彩评论