0

谁能告诉我为什么这会在运行时出错:

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,那么问题是什么?

4

3 回答 3

2

IIf 函数不使用短路评估。所以它总是会评估一切,即使可能什么都不是。

MSDN 关于这个主题。

于 2012-01-31T01:20:56.067 回答
1

首先,在 VB.NET 10 之前不支持集合初始化器。

话虽如此,第一个示例是为第三个参数传入一个空(无)值。IIf 函数始终评估所有三个参数,而不管第一个参数的真/假状态。我相信这就是您收到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
于 2012-01-31T01:23:53.480 回答
1

尝试使用 IF 运算符而不是 IIF。会短路。请参阅MSDN上的这篇文章

于 2012-01-31T01:30:22.710 回答