C# 带任意()的安全导航操作员
嘿,各位,我认为这段代码在任何情况下都是有效的,因为它是用bool铸造的C# 带任意()的安全导航操作员,c#,C#,嘿,各位,我认为这段代码在任何情况下都是有效的,因为它是用bool铸造的 parameter.Request?.InnerData?.Any() == false 相反,此代码被转换为类型bool? 能告诉我为什么吗?(这是主要问题) 有没有更好的方法来检查这个而不是像这样的东西 var isThereInnerData = parameter.Request?.InnerData?.Any(); if (isThereSegments == null || isThereSegments =
parameter.Request?.InnerData?.Any() == false
相反,此代码被转换为类型bool?
能告诉我为什么吗?(这是主要问题)
有没有更好的方法来检查这个而不是像这样的东西
var isThereInnerData = parameter.Request?.InnerData?.Any();
if (isThereSegments == null || isThereSegments == false)
bool
是一种值类型,每个默认值不能与null
进行比较。C#将返回值转换为bool?
以提供支持两者的选项。bool
是一种值类型,默认情况下不能与null
进行比较。C#将返回值转换为bool?
以提供同时支持这两个值的选项。使用null条件运算符,null传播。如果使用null条件运算符,则不能得到不可为null的类型-在默认情况下null操作是“安全”的语言(SQL、Objective-C等)中,这与此相同。因此,如果parameter.Request
为空,或者parameter.Request.InnerData
为空,则结果为default(bool?
)。否则,您将得到true或false,但是通过使用null条件运算符,您已经假设结果实际上可以为null,因此编译器必须适应这一点。由于bool
不能为null,因此它被更改为可为null的bool(bool?
)
解决方案很简单-考虑null应该具有什么逻辑值,并使用该值:
if (parameter.Request?.InnerData?.Any() ?? true)
在这种情况下,null值被解释为true,但如果需要,也可以使用false。或者,您可以使用感觉更好的
GetValueOrDefault
,而不是null合并运算符。使用null条件运算符,null会传播。如果使用null条件运算符,则不能得到不可为null的类型-在默认情况下null操作是“安全”的语言(SQL、Objective-C等)中,这与此相同。因此,如果parameter.Request
为空,或者parameter.Request.InnerData
为空,则结果为default(bool?
)。否则,您将得到true或false,但是通过使用null条件运算符,您已经假设结果实际上可以为null,因此编译器必须适应这一点。由于bool
不能为null,因此它被更改为可为null的bool(bool?
)
解决方案很简单-考虑null应该具有什么逻辑值,并使用该值:
if (parameter.Request?.InnerData?.Any() ?? true)
在这种情况下,null值被解释为true,但如果需要,也可以使用false。或者,您可以使用感觉更好的GetValueOrDefault
,而不是空合并运算符。下面是关于运算符的说明。
运算符:
x?.y–空条件成员访问如果左侧为空,则返回null
操作数为空
由于在编译时编译器不知道表达式的计算结果是否为非null值,因此编译器推断类型为Nullable
由于您正在链接?。
操作员,msdn文档中的这一行也很相关:
空条件运算符为
短路。如果条件成员链中的一个操作
访问和索引操作返回null,然后链的其余部分返回null
执行停止。中优先级较低的其他操作
表达继续。例如,下面的E始终执行,
那这个呢??and==执行的操作
以下是关于?。
操作员的说明:
x?.y–空条件成员访问如果左侧为空,则返回null
操作数为空
由于在编译时编译器不知道表达式的计算结果是否为非null值,因此编译器推断类型为Nullable
由于您正在链接?。
操作员,msdn文档中的这一行也很相关:
空条件运算符为
短路。如果条件成员链中的一个操作
访问和索引操作返回null,然后链的其余部分返回null
执行停止。中优先级较低的其他操作
表达继续。例如,下面的E始终执行,
那这个呢??and==执行的操作
因为一旦
Request
为null
或Request.InnerData
为null
,整个表达式将计算为null
。由于它可以返回null
或bool
,显然编译器会将其推断为null
(bool?
),而不是if(isThereSegments==null | | isThereSegments==false)
除非您需要为这两种情况编写代码► 我认为编译器返回一个bool?
是有意义的,因为本质上不确定安全导航操作符是否能够返回值,因为一旦Request
为null
或Request.InnerData
为null
,整个表达式的计算结果将为null
。由于它可以返回null
或bool
,显然编译器会将其推断为null
(bool?
),而不是if(isThereSegments==null | | isThereSegments==false)
除非您需要为这两种情况编写代码► 我认为编译器返回一个bool?
是有意义的,因为安全导航操作符是否能够返回一个值本身就不确定。问题是为什么语句的计算结果是一个可为null的bool,这一点在其他帖子中得到了回答。问题是为什么该语句的计算结果是可为空的布尔值,这一点在其他帖子中得到了回答。