关于VB.NET nullable:datetime和三元运算符

VB.NET - Nullable DateTime and Ternary Operator

我在vb.net中遇到了一个可以为空的日期时间问题(与2010年相比)。

方法1

1
2
3
4
5
If String.IsNullOrEmpty(LastCalibrationDateTextBox.Text) Then
    gauge.LastCalibrationDate = Nothing
Else
    gauge.LastCalibrationDate = DateTime.Parse(LastCalibrationDateTextBox.Text)
End If

方法2

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

当给定空字符串时,方法1为gauge.lastCalibrationDate分配一个空(无)值,但方法2为其分配datetime.minValue。

在我的代码中的其他地方,我有:

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

这会正确地将三元运算符中的空(无)赋值给可为空的日期时间。

我错过了什么?谢谢!


鲍勃·麦克是对的。注意他的第二点-这不是C的情况。

您需要做的是强制Nothing到一个可以为空的日期时间,方法如下:

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

下面是一段演示:

1
2
3
4
5
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)

您也可以声明一个新的可以为空的:New Nullable(Of DateTime)New DateTime?()。后一种格式看起来有点奇怪,但它是有效的。


我承认我不是这方面的专家,但很明显,这有两个原因:

  • If三元运算符只能返回一种类型,在这种情况下,日期类型不能为空。
  • vb.net Nothing值实际上不是null值,而是等同于指定类型的默认值,在这种情况下是日期,而不是可以为空的日期。因此是日期最小值。
  • 我从下面得到了这个答案的大部分信息:三元运算符vb vs c:为什么解析为整数而不是整数?

    希望这能有所帮助,像乔尔·科霍恩这样的人能对这个问题有更多的了解。