几天前,我们将vb6项目转换为.net项目。
经过一些测试后,出现了一种奇怪的行为。
If conditiona a <> 1 And conditionB = 1 And conditionC <> 0 Then
<block>
EndIf
正在执行该块,即使它是错误的。它适用于我改变和为AndAlso。为什么会这样?它在VB6上运行良好。
答案 0 :(得分:1)
通过使用您的值复制代码,会产生Operator '=' is not defined for type 'DBNull' and type 'Integer'.
错误。
Private Sub Test()
If conditionA() <> 21 And conditionB() = 1 And conditionC() <> 0 Then
MsgBox("Ops")
End If
End Sub
Private Function conditionA() As Object
Return 1D
End Function
Private Function conditionB() As Object
Return DBNull.Value
End Function
Private Function conditionC() As Object
Return 5I
End Function
所以我认为假设执行块的原因仅仅是因为满足条件是公平的。
处理未知类型时,您应该如何比较对象:
If ((Not Object.Equals(conditionA(), 21I)) And Object.Equals(conditionB(), 1I) And (Not Object.Equals(conditionC(), 0I))) Then
'<block>
End If