.NET三元运算符和类型转换问题

问题描述 投票:2回答:1

我有一个三元表达式,检查Object是否是DBNull.Value并返回Nothing如果True否则如果False返回转换为DateObject类型的值。然而,由于一些奇怪的原因,由三元表达式设置的可空的DateTime变量神秘地设置为'1/1/0001 12:00:00 AM',即使Object肯定是DBNull.Value。其他人可以重现这种行为吗?如果是这样,为什么会发生?

奇怪的是,我已将此表达式更改为常规的旧if和else块,而我根本没有得到这种行为。所以,它必须与三元语句有关。

Module Module1

Sub Main()
    Dim dt As New DataTable
    dt.Columns.Add(New DataColumn("DateColumn", GetType(String)))
    dt.Rows.Add()
    Dim testDate = dt(0).Item(0)
    Dim setDate As DateTime? = Nothing
    'Doesn't work
    setDate = If(testDate Is DBNull.Value, Nothing, CDate(testDate))
    'Works
    'If testDate Is DBNull.Value Then
    '    setDate = Nothing
    'Else
    '    setDate = CDate(testDate)
    'End If
    'Also works
    'setDate = If(testDate Is DBNull.Value, Nothing, CType(testDate, DateTime?))
    'This works too
    'setDate = If(testDate Is DBNull.Value, Nothing, testDate)
    'Working
    'setDate = IIf(testDate Is DBNull.Value, Nothing, testDate)
    If setDate IsNot Nothing Then
        Console.WriteLine("Why does setDate = '" & setDate.ToString & "' ?!")
    End If
    Console.ReadKey()
End Sub

End Module

我想使用三元语句,因为它代码较少。

vb.net ternary-operator
1个回答
2
投票

原因是VB将If运算符的返回类型推断为Date,因为这是CDate返回的。 Nothing关键字可以转换为不可空的Date对象,因为Nothing在VB中也意味着“默认”,而Date的默认值是1/1/0001 12:00:00 AM。要解决这个问题,你必须确保至少有一个参数是明确的DateTime?

例如,这可以工作:

setDate = If(testDate Is DBNull.Value, New DateTime?, CDate(testDate))
© www.soinside.com 2019 - 2024. All rights reserved.