使用iif()进行集合初始化会抛出ArgumentNullException

时间:2012-01-31 00:51:02

标签: vb.net initialization short-circuiting argumentnullexception

任何人都可以告诉我为什么这会在运行时出错:

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将永远不会被调用,那么问题是什么?

3 个答案:

答案 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

上的这篇文章