从空条件赋值时,返回可为空的值类型是有意义的。 否则,如果对象为 null,则 null 条件将返回值类型的默认值,而您不希望这样做。 因此,这很好:
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*/ }
在额外的代码和必须用参数包装表达式之间,null条件的速记语法的整个目的似乎被破坏了。 这是处理空条件返回值的正确方法,还是有另一种不涉及考虑可为空返回值的方法?
如果A?.B
包含引用类型的B
,则返回类型为 B
。 否则,如果B
是值类型,则返回类型是围绕类型 B
的可为 null 的包装。 所以,这是对你的问题的简短回答。
话虽如此,在您的情况下,既然您正在返回bool
,因此可以理解它将被包装为bool?
。 知道了这一点,您应该像平时一样简单地使用它 bool?
. 一种方法是简单地与期望值 bool
进行相等比较。
例如:
if (Employee?.IsTerminated == true) { }
它比以下内容更短,更容易阅读:
if ((Employee?.IsTerminated).GetValueOrDefault()) { }
示例比较有效,因为null
永远不会等于bool
。
您始终可以使用空合并运算符:
if (Employee?.IsTerminated ?? false) { /*do something here*/ }