可空的DateTime和三元运算符

我在VB.NET中遇到Nullable DateTime问题(VS 2010)。

方法1

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

方法2

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

当给定一个空字符串时,方法1将一个Null(Nothing)值赋给gauge.LastCalibrationDate,但方法2将它赋值给DateTime.MinValue。

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

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

这正确地将Null(Nothing)从三元运算符分配给Nullable DateTime。

我错过了什么? 谢谢!


我承认我不是这方面的专家,但显然它源于两件事情:

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

    希望这会有所帮助,像Joel Coehoorn这样的人可以更多地了解这个问题。


    Bob Mc是对的。 请特别注意他的第二点 - C#中不是这种情况。

    你需要做的是通过强制Nothing将它转换为可空的DateTime,如下所示:

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

    这里是一个片段来演示:

    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?() 。 后一种格式看起来有点奇怪,但它是有效的。

    链接地址: http://www.djcxy.com/p/42851.html

    上一篇: Nullable DateTime and Ternary Operator

    下一篇: Make An Integer Null