任何人都可以告诉我为什么这会在运行时出错:
Dim mightBeNothing As List(Of String) = Nothing
Dim a As List(Of String) = IIf(mightBeNothing Is Nothing, New List(Of String)(), New List(Of String)(mightBeNothing))
我在第二行得到ArgumentNullException
。如果我用以下代码替换最后一部分:
Dim a As List(Of String) = IIf(mightBeNothing Is Nothing, New List(Of String)(), New List(Of String)())
它有效 - 但如果New List(Of String)(mightBeNothing)
什么都没有,那么构造函数mightBeNothing
将永远不会被调用,那么问题是什么?
答案 0 :(得分:2)
IIf功能不使用短路评估。所以它总会评估一切,即使mightBeNothing什么都不是。
MSDN关于这个主题。
答案 1 :(得分:1)
首先,在VB.NET 10之前不支持集合初始值设定项。
话虽如此,第一个例子是传递第三个参数的null(Nothing)值。无论第一个参数的真/假状态如何,IIf Function总是评估所有三个参数。我相信这就是你收到ArgumentNullException
。
在第二种情况下,没有一个参数是Nothing
所以它可以工作,但是没有给你想要的结果。
我建议使用If Else:
Dim mightBeNothing As List(Of String) = Nothing
Dim a As List(Of String)
If mightBeNothing Is Nothing Then
a = New List(Of String)
Else
a = New List(Of String)
a.Add(mightBeNothing)
End If
答案 2 :(得分:1)
尝试使用IF运算符而不是IF。它会短路。请参阅MSDN
上的这篇文章