Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.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
C# 带任意()的安全导航操作员_C# - Fatal编程技术网

C# 带任意()的安全导航操作员

C# 带任意()的安全导航操作员,c#,C#,嘿,各位,我认为这段代码在任何情况下都是有效的,因为它是用bool铸造的 parameter.Request?.InnerData?.Any() == false 相反,此代码被转换为类型bool? 能告诉我为什么吗?(这是主要问题) 有没有更好的方法来检查这个而不是像这样的东西 var isThereInnerData = parameter.Request?.InnerData?.Any(); if (isThereSegments == null || isThereSegments =

嘿,各位,我认为这段代码在任何情况下都是有效的,因为它是用bool铸造的

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,这一点在其他帖子中得到了回答。问题是为什么该语句的计算结果是可为空的布尔值,这一点在其他帖子中得到了回答。