在检查条件时,null-conditionals是否有可能不返回可为空的值类型?

时间:2016-03-02 17:47:58

标签: c# .net nullable null-conditional-operator

从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中之间,空条件的短手语法的整个目的似乎被打败了。这是处理空条件返回值的正确方法,还是有另一种方法不涉及可归结的返回值?

2 个答案:

答案 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*/ }