从null条件赋值时,有意义返回可以为null的值类型。否则,如果对象为null,则null条件将返回值类型的默认值,并且您不希望这样。因此,这很好:
bool? IsTerminated = Employee?.IsTerminated;
但是,如果我只是检查一个条件,为什么它会返回一个可空类型?你会认为编译器可以很好地解决这个问题:
if (Employee?.IsTerminated) { /*do something here*/ }
毕竟,它只是编译到这个,对吧?
if (Employee != null && Employee.IsTerminated) { /*do something here*/ }
为了让它发挥作用,我必须这样做:
if ((Employee?.IsTerminated).GetValueOrDefault()) { /*do something here*/ }
在额外的代码和必须将表达式包装在parens中之间,空条件的短手语法的整个目的似乎被打败了。这是处理空条件返回值的正确方法,还是有另一种方法不涉及可归结的返回值?
答案 0 :(得分:2)
如果A?.B
包含引用类型的B
,那么您将获得B
类型的返回。否则,如果B
是值类型,则返回类型是类型为B
的可空包装。所以,这是对你的问题的简短回答。
话虽如此,在您的情况下,由于您正在取回bool
,因此可以理解它将被包裹为bool?
。知道这一点,您应该像通常使用bool?
一样使用它。一种方法是简单地对所需的bool
值进行相等比较。
例如:
if (Employee?.IsTerminated == true) { }
它比以下更简单易读:
if ((Employee?.IsTerminated).GetValueOrDefault()) { }
示例比较有效,因为null
永远不会等于bool
。
答案 1 :(得分:0)
您始终可以使用 null coalesce operator :
if (Employee?.IsTerminated ?? false) { /*do something here*/ }