使用VB.NET IIF获取NullReferenceException
我正在进行一点调试,因此我想记录eventArgs值 我有一条简单的线路,基本上可以:使用VB.NET IIF获取NullReferenceException,.net,vb.net,nullreferenceexception,.net,Vb.net,Nullreferenceexception,我正在进行一点调试,因此我想记录eventArgs值 我有一条简单的线路,基本上可以: logLine = "e.Value: " + IIf(e.Value Is Nothing, "", e.Value.ToString()) 我理解IIF函数的方式是,如果e.Value为Nothing(null),那么它应该返回空字符串,如果不是,它应该返回值的.ToString。然而,我得到了一个NullReferenceException。这对我来说毫无意义 有什么想法吗?VB在Iif中不进行短路评
logLine = "e.Value: " + IIf(e.Value Is Nothing, "", e.Value.ToString())
我理解IIF函数的方式是,如果e.Value为Nothing(null),那么它应该返回空字符串,如果不是,它应该返回值的.ToString。然而,我得到了一个NullReferenceException。这对我来说毫无意义
有什么想法吗?VB在Iif中不进行短路评估。在您的情况下,无论e.Value是否为nothing,都会对e.Value.ToString()进行求值。这是预期的行为
IIF
是一个函数;因此,在将函数发送到函数之前,将对函数的参数进行评估
相比之下,C#中的三元运算符是一种语言构造,如果三元表达式为真,则会阻止对第二个参数求值。是一个实际函数,因此所有参数都会求值。关键字被添加到VB.NET 2008中,以提供您期望的短路功能
试一试
另外:If()是类型安全的。IIf()不是。我仍然无法将短路If用于Date和Boolean等类型,但仍然分配给可为空的类型。例如,我想像上面一样使用“If”将“Nothing”返回给一个可为空的布尔值,但它仍然返回“False”。如果逻辑按预期工作,我会将行分隔为If-Else结尾,这是一件疯狂的事情。@atconway,显然VB中的
Nothing
类似于C#中的default
,而不是null
,因此当在布尔
是隐含类型的上下文中使用时,它的值是False
,而不是您通常认为的null
/Nothing
(per)。您需要将If
的一侧强制转换为正确的类型(例如Boolean?
),以获得所需的结果。类似地,在C#中,您需要强制转换一侧(但如果您不这样做,则这是一个编译错误)。那么您知道解决方案吗?是的,如所选答案所示,使用if
。
logLine = "e.Value: " + If(e.Value Is Nothing, "", e.Value.ToString())