C# 空条件是否可能在检查条件时不返回可为空的值类型?
当从null条件赋值时,返回一个可为null的值类型是有意义的。否则,如果对象为null,null条件将返回值类型的默认值,您不希望这样。因此,这是好的:C# 空条件是否可能在检查条件时不返回可为空的值类型?,c#,.net,nullable,null-conditional-operator,C#,.net,Nullable,Null Conditional Operator,当从null条件赋值时,返回一个可为null的值类型是有意义的。否则,如果对象为null,null条件将返回值类型的默认值,您不希望这样。因此,这是好的: bool? IsTerminated = Employee?.IsTerminated; 但是,如果我只是检查一个条件,为什么它会返回一个可为null的类型呢?您可能认为编译器可以很好地解决这个问题: if (Employee?.IsTerminated) { /*do something here*/ } 毕竟,它只是编译成这个,对吗
bool? IsTerminated = Employee?.IsTerminated;
但是,如果我只是检查一个条件,为什么它会返回一个可为null的类型呢?您可能认为编译器可以很好地解决这个问题:
if (Employee?.IsTerminated) { /*do something here*/ }
毕竟,它只是编译成这个,对吗
if (Employee != null && Employee.IsTerminated) { /*do something here*/ }
为了让它工作,我必须这样做:
if ((Employee?.IsTerminated).GetValueOrDefault()) { /*do something here*/ }
在额外的代码和必须用parens包装表达式之间,null条件的简写语法的全部目的似乎都失败了。这是处理空条件返回值的正确方法,还是有另一种方法不涉及计算可空返回值?如果
a?.B
包含引用类型的B
,则您将得到类型为B
的返回。否则,如果B
是值类型,则返回类型是可为空的环绕类型B
。这是对你问题的简短回答
话虽如此,在您的情况下,因为您要返回一个bool
,所以可以理解它将被包装为bool?
。知道了这一点,您就应该像平常处理bool?
一样处理它。一种方法是简单地与所需的bool
值进行相等比较
例如:
if (Employee?.IsTerminated == true) { }
它比以下内容更简短、更容易阅读:
if ((Employee?.IsTerminated).GetValueOrDefault()) { }
示例比较是有效的,因为
null
永远不会等于bool
您可以始终使用null合并运算符:
if (Employee?.IsTerminated ?? false) { /*do something here*/ }
您可以使用
if(Employee?.IsTerminated==true)
而不是GetValueOrDefault
。因此,这只是布尔表达式的一个问题,可能是因为二进制表达式(两个表达式之间的比较运算符)和布尔表达式之间存在差异,而布尔表达式意味着相等运算符。语言架构师,如果我们幸运的话,也许有一天我们可以重新定义操作符,这样我们就可以做更直观的bool b=foo?.booleanproperty
。我想,我知道争论的双方,这真的应该是默认行为,因为它很方便。@dlatikay To each是自己的,我想。对我来说,这更直观:bool?b=foo?.booleanproperty
。那是因为如果foo
是null
,我希望b
是null
;否则,我会期望出现bool
。因此,一个可空的bool
非常有意义。我猜你的意思是,如果foo
是null
,那么b
将是false
?我可以看到这种隐性转换的吸引力,但这实际上会剥夺一些决定如何处理价值的自由。如果foo
为null
,我希望在某些情况下知道它,这样我的代码就可以正确处理它,而不是屏蔽它。@dlatikay我想处理这个问题的方法是允许程序员根据他们的特殊需要选择结果是bool
还是bool?
,如果使用了bool
,则将null
转换为false
。