使用VB.NET IIF时出现了NullReferenceException异常。

48

我在进行一些调试,因此我想记录eventArgs的值。

我有一行简单的代码,基本上是这样的:

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

我理解的 IIF 函数的作用是如果 e.Value 是空值(null)则返回空字符串,否则返回该值的 .ToString()。然而,我却得到了一个 NullReferenceException 异常,这对我来说没有意义。

有任何想法吗?

3个回答

91

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

尝试一下。

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

7
也就是说:If() 是类型安全的,而 IIf() 不是。 - Joel Coehoorn
我仍然在使用短路If与Date和Boolean等类型时遇到问题,但仍将其分配给可空类型。例如,我想使用'If'将'Nothing'返回到Nullable Boolean值,但它仍然返回'False'。当我将行拆分为If-Else-End If时,疯狂的事情是逻辑按预期工作。 - atconway
2
@atconway,显然VB中的“Nothing”类似于C#中的“default”,而不是“null”,因此当在隐含类型为“Boolean”的上下文中使用它时,它的值为“False”,而不是你通常想到的“null”/“Nothing”(参见https://dev59.com/60rSa4cB1Zd3GeqPXpiW)。您需要将`If`语句的一侧转换为正确的类型(例如`Boolean?`)才能获得所需的结果。同样,在C#中,您需要转换一侧(但如果不这样做,它会导致编译错误)。 - bdukes

4

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


你知道解决方案吗? - Daniel E.
是的,请像所选答案建议的那样使用 If - Chris Farmer

3

这是期望的行为。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接