【问题标题】:Using VB.NET IIF I get NullReferenceException使用 VB.NET IIF 我得到 NullReferenceException
【发布时间】:2010-09-30 13:08:19
【问题描述】:

我正在做一些调试,所以我想记录 eventArgs 值

我有一条简单的线,基本上可以:

logLine = "e.Value: " + IIf(e.Value Is Nothing, "", e.Value.ToString())

我理解 IIF 函数的方式,如果 e.Value 是 Nothing (null) 那么它应该返回空字符串,如果不是它应该返回值的 .ToString。但是,我得到了 NullReferenceException。这对我来说没有意义。

有什么想法吗?

【问题讨论】:

    标签: .net vb.net nullreferenceexception


    【解决方案1】:

    IIf 是一个实际函数,因此所有参数都会被评估。 If 关键字已添加到 VB.NET 2008 以提供您所期望的短路功能。

    试试

    logLine = "e.Value: " + If(e.Value Is Nothing, "", e.Value.ToString())
    

    【讨论】:

    • 另外:If() 是类型安全的。 IIf() 不是。
    • 我仍然有使用短路 If 与 Date 和 Boolean 等类型的问题,但仍分配给可为空的类型。例如,我想像上面一样使用“If”将“Nothing”返回到 Nullable 布尔值,但它仍然返回“False”。如果逻辑按预期工作,那么当我将线路中断为 If-Else-End 时,这很疯狂。
    • @atconway,显然 VB 中的 Nothing 类似于 C# 中的 default,而不是 null,因此当在 Boolean 是隐含类型的上下文中使用时,其值为 @ 987654329@ 而不是您通常认为的null/Nothing(根据stackoverflow.com/q/1828173/2688)。您需要将If 的一侧转换为正确的类型(例如Boolean?)以获得所需的结果。同样在 C# 中,您需要转换一侧(但如果您不这样做,则会出现编译错误)。
    【解决方案2】:

    VB 在 Iif 中不做短路评估。在您的情况下,无论 e.Value 是否为空,都会对 e.Value.ToString() 进行评估。

    【讨论】:

    • 那你知道解决办法吗?
    • 是的,按照所选答案的建议使用If
    【解决方案3】:

    这是预期的行为。

    IIF 是一个函数;因此,函数的参数将在将其发送到函数之前进行评估。

    相比之下,C# 中的三元运算符是一种语言结构,如果三元表达式为真,则阻止对第二个参数求值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 2013-11-11
      • 2021-06-25
      • 1970-01-01
      相关资源
      最近更新 更多