Any()的安全导航操作员

时间:2016-12-13 09:02:00

标签: c#

嘿所有人我认为这段代码在任何情况下都是有效的,因为它被铸造成bool

status_up / group_total

而是将此代码转换为parameter.Request?.InnerData?.Any() == false

类型

可以告诉我某人为什么? (这是主要问题) 是否有更好的方法来检查这个而不是这样的东西?

bool?

3 个答案:

答案 0 :(得分:2)

使用空条件运算符,null传播。如果使用空条件运算符,则不能以非可空类型结束 - 这与默认情况下空操作“安全”的语言中的行为相同(SQL,Objective-C,...)。因此,如果default(bool?)为空,或parameter.Request为空,则结果为parameter.Request.InnerData。否则,你得到true或false,但是通过使用null-conditional运算符,你已经假设结果 can 实际上是null,所以编译器必须容纳它。由于bool不能为null,因此会将其更改为可以为空的bool(bool?)。

解决方案很简单 - 想一想null应该具有什么逻辑值,并使用它:

if (parameter.Request?.InnerData?.Any() ?? true)

在这种情况下,null值被解释为true,但如果需要,也可以使用false。或者,您可以使用GetValueOrDefault代替空合并运算符,无论什么感觉更适合您。

答案 1 :(得分:1)

以下是C# reference关于?.运算符的说法:

  

x?.y - null条件成员访问。 如果左手,则返回null   操作数为空。

由于在编译时编译器不知道表达式是否将计算为非空值,编译器会将类型推断为Nullable<bool>

由于您链接?.运算符,msdn文档中的这一行也是相关的:

  

空条件运算符是   短路。如果一个条件成员链中的一个操作   访问和索引操作返回null,然后是链的其余部分   执行停止。其他优先级较低的操作   表达继续。例如,以下E始终执行,   和??和==操作执行。

答案 2 :(得分:0)

bool是一种值类型,默认情况下无法与null进行比较。 C#会将您的返回值转换为bool?,以便为您提供支持两者的选项。