Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用VB.NET IIF获取NullReferenceException_.net_Vb.net_Nullreferenceexception - Fatal编程技术网

使用VB.NET IIF获取NullReferenceException

使用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中不进行短路评

我正在进行一点调试,因此我想记录eventArgs值

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

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())