0

谁能告诉我为什么这个在运行时提供了一个错误:集合初始化抛出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)()) 

它的工作原理 - 但如果mightBeNothing是什么构造New List(Of String)(mightBeNothing)将永远不会被调用,所以有什么问题?

回答

2

该IIf功能不使用短路评估。所以它会一直评估一切,即使可能没有什么。

MSDN关于这个问题。之前VB.NET 10.

话虽如此,第一个例子是在零(没有)值传递给第三个参数

+0

谢谢,我将iif()更改为if()并且它按预期工作。不知道为什么你会希望不要短路,我只是假设它没有。 – Flash 2012-01-31 01:29:31

+0

IIf是一个棘手的小野兽 - 我现在不做很多VB.NET,但几年前,我和它扔了我一个循环,因为我认为它会像C#三元运算符(?:) 。 – Tim 2012-01-31 01:32:38

+1

Iif不会短路,因为它是一个普通的功能,而不是像If这样的运算符。 – 2012-01-31 01:39:59

1

首先,集合初始化不被支持。不管第一个参数的真/假状态如何,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 
1

尝试使用IF操盘IIF。它会短路。看到这篇文章MSDN