我在VB.NET中发现了一个可以轻松复制的简单错误:
Dim pDate As Date?
Dim pString As String = ""
' works fine as expected
pDate = If(False, "", Nothing)
' expected: pDate will be set to Nothing.
' BUG: Conversion from string "" to type 'Date' is not valid.
pDate = If(False, pString, Nothing)
'These both fail with the same error
pDate = pString
Dim pDate2 As Date? = ""
Run Code Online (Sandbox Code Playgroud)
问题:这是一个错误吗?或者我或我的电脑有问题吗?如果这是一个错误,是否有错误报告(我似乎无法找到它)?
得到教训:
pDate = Nothing ' ok. nullable date accepts object nothing
pString = Nothing
pDate = pString ' error. nullable date rejects string nothing
Run Code Online (Sandbox Code Playgroud)
这个错误是你第一次使用的If(),而不是第二个.与您的评论相反,结果并非"预期".该调用应该失败,因为""无法转换为日期,并且三元运算符在所有级别都是类型安全的,无论是否使用该表达式.
我怀疑它是成功的,因为编译器优化:因为一切都是文字,条件被优化了.第二次进行优化比较困难,因为pString变量可能被编译器还不知道的另一个线程改变了.
对IL有用的人可能会证实这一点.
对我来说真正意外的是,直到运行时才会发现这一点.我希望编译器注意到类型不匹配并在该级别进行抱怨,而不是等到执行.您的VB选项设置可能与此有关.