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

本文关键字:条件 类型 返回 有可能 检查 是否 | 更新日期: 2023-09-27 18:37:02

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