1

当从一个空条件赋值时,返回一个可以为空的值类型是有意义的。否则,如果对象为 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*/ }

在额外的代码和必须将表达式包装在括号中之间,空条件的简写语法的整个目的似乎被打败了。这是处理空条件返回值的正确方法,还是有另一种不涉及可空返回值的方法?

4

2 回答 2

2

如果A?.BcontainsB引用类型,那么您将获得 type 的返回B。否则,如果B是一个值类型,则返回类型是一个可空的环绕 type B。所以,这是对你问题的简短回答。

话虽如此,在您的情况下,由于您要返回 a bool,因此可以理解将其包装为bool?. 知道了这一点,您应该像通常使用bool?. 一种方法是简单地对 的期望值进行相等比较bool

例如:

if (Employee?.IsTerminated == true) { }

它比以下内容更短且更易于阅读:

if ((Employee?.IsTerminated).GetValueOrDefault()) {  }

示例比较有效,因为null将永远不会等于 a bool

于 2016-03-02T18:37:00.177 回答
0

您始终可以使用空合并运算符

if (Employee?.IsTerminated ?? false) { /*do something here*/ }
于 2016-03-02T23:39:54.427 回答