使用 VB.NET IIF 我得到 NullReferenceException

Using VB.NET IIF I get NullReferenceException

提问人:Nathan Koop 提问时间:1/10/2009 最后编辑:Joel CoehoornNathan Koop 更新时间:10/25/2012 访问量:24246

问:

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

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

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

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

有什么想法吗?

.NET vb.net NullReferenceException

评论


答:

4赞 Chris Farmer 1/10/2009 #1

VB 在 IIF 中不进行短路评估。在您的例子中,无论 e.Value 是否为空,都会计算 e.Value.ToString()。

评论

0赞 Daniel E. 9/25/2019
那你知道解决方案吗?
0赞 Chris Farmer 9/26/2019
是的,按照所选答案的建议使用。If
3赞 Philip Fourie 1/10/2009 #2

这是预期行为。

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

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

91赞 bdukes 1/10/2009 #3

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

尝试

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

评论

7赞 Joel Coehoorn 1/10/2009
另外:If() 是类型安全的。IIf() 不是。
0赞 atconway 12/14/2011
我仍然无法将短路 If 与 Date 和 Boolean 等类型一起使用,但仍分配给可为 null 的类型。例如,我想像上面一样使用“If”将“Nothing”返回到一个可为 Null 的布尔值,但它仍然返回“False”。当我将线条分解为 If-Else-End 时,如果逻辑按预期工作,这真是太疯狂了。
2赞 bdukes 12/15/2011
@atconway,显然在 VB 中就像在 C# 中一样,而不是 ,所以当在隐含类型的上下文中使用时,它的值不是你通常认为的 /(每 stackoverflow.com/q/1828173/2688)。您需要将 的一侧转换为正确的类型(例如 )才能获得所需的结果。同样,在 C# 中,您需要强制转换一侧(但如果不这样做,则为编译错误)。NothingdefaultnullBooleanFalsenullNothingIfBoolean?