提问人:Nathan Koop 提问时间:1/10/2009 最后编辑:Joel CoehoornNathan Koop 更新时间:10/25/2012 访问量:24246
使用 VB.NET IIF 我得到 NullReferenceException
Using VB.NET IIF I get NullReferenceException
问:
我正在做一些调试,所以我想记录eventArgs值
我有一条简单的行,基本上是这样:
logLine = "e.Value: " + IIf(e.Value Is Nothing, "", e.Value.ToString())
我理解 IIF 函数的方式是,如果 e.Value 为 Nothing (null),那么它应该返回空字符串,如果不是,它应该返回 .ToString 的值。但是,我得到了一个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# 中,您需要强制转换一侧(但如果不这样做,则为编译错误)。Nothing
default
null
Boolean
False
null
Nothing
If
Boolean?
评论