.NET 三元运算符和类型转换问题
Issue With .NET Ternary Operator and Type Conversions
我有一个三元表达式,用于检查 Object
是否为 DBNull.Value
和 returns Nothing
if True
else if False
returns 值转换为 Object
的 Date
类型。但是,由于某些奇怪的原因,我的由三元表达式设置的可空 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 将 If
运算符的 return 类型推断为 Date
,因为这就是 CDate returns。 Nothing
关键字可以转换为不可为 null 的 Date
对象,因为 Nothing 在 VB 中也表示 "default",而 Date 的默认值是 1/1/0001 12:00:00 AM
.要解决此问题,您必须确保至少有一个参数明确为 DateTime?
.
例如,这会起作用:
setDate = If(testDate Is DBNull.Value, New DateTime?, CDate(testDate))
我有一个三元表达式,用于检查 Object
是否为 DBNull.Value
和 returns Nothing
if True
else if False
returns 值转换为 Object
的 Date
类型。但是,由于某些奇怪的原因,我的由三元表达式设置的可空 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 将 If
运算符的 return 类型推断为 Date
,因为这就是 CDate returns。 Nothing
关键字可以转换为不可为 null 的 Date
对象,因为 Nothing 在 VB 中也表示 "default",而 Date 的默认值是 1/1/0001 12:00:00 AM
.要解决此问题,您必须确保至少有一个参数明确为 DateTime?
.
例如,这会起作用:
setDate = If(testDate Is DBNull.Value, New DateTime?, CDate(testDate))