Vb.net 使用iif()初始化集合会引发ArgumentNullException

Vb.net 使用iif()初始化集合会引发ArgumentNullException,vb.net,initialization,short-circuiting,argumentnullexception,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 Str

有人能告诉我为什么在运行时会出现错误:

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
什么都不是,则永远不会调用构造函数
新列表(字符串)(mightBeNothing)
,那么问题是什么呢?

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


关于该主题。

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


首先,VB.NET 10之前不支持集合初始值设定项

话虽如此,第一个示例为第三个参数传递null(Nothing)值。始终计算所有三个参数,而不考虑第一个参数的真/假状态。我相信这就是您收到
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

首先,VB.NET 10之前不支持集合初始值设定项

话虽如此,第一个示例为第三个参数传递null(Nothing)值。始终计算所有三个参数,而不考虑第一个参数的真/假状态。我相信这就是您收到
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

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

谢谢的文章,我将iif()改为if(),它可以正常工作。我不知道你为什么希望iif不短路,我只是假设它短路了。iif是一只狡猾的小野兽-我现在不常使用VB.NET,但几年前我是,它让我陷入了一个循环,因为我假设它会像C#三元运算符(?:)一样工作。iif不会短路,因为它是一个简单的函数,而不是像If这样的运算符。谢谢,我将iif()改为if(),它按预期工作。我不知道为什么你会希望iif不短路,我只是假设它短路了。iif是一只狡猾的小野兽-我现在不怎么使用VB.NET,但几年前我是,它让我陷入了一个循环,因为我假设它会像C#三元运算符(?:)一样工作。iif不会短路,因为它是一个简单的函数,而不是像If这样的运算符。