【问题标题】:Collection initialisation using iif() throws ArgumentNullException使用 iif() 进行集合初始化会引发 ArgumentNullException
【发布时间】:2012-01-31 00:51:02
【问题描述】:

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

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

【问题讨论】:

    标签: vb.net initialization short-circuiting argumentnullexception


    【解决方案1】:

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

    MSDN 关于这个主题。

    【讨论】:

    • 谢谢,我将 iif() 更改为 if() 并且它按预期工作。不知道你为什么要如果不短路,我只是假设它确实如此。
    • IIf 是一个狡猾的小野兽 - 我现在不做很多 VB.NET,但几年前我做过,它让我陷入了一个循环,因为我认为它会像C# 三元运算符 (?:)。
    • Iif 不会短路,因为它是一个普通函数,而不是像 If 这样的运算符。
    【解决方案2】:

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

    话虽如此,第一个例子是为第三个参数传入一个空(无)值。 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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-09
        • 1970-01-01
        • 2014-10-01
        • 2023-03-18
        • 2015-01-11
        • 1970-01-01
        相关资源
        最近更新 更多