首页 文章

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

提问于
浏览
1

从null条件赋值时,返回可为空的值类型是有意义的 . 否则,如果对象为null,则null-conditional将返回值类型's default and you don' t . 因此,这很好:

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

2 回答

  • 2

    如果 A?.B 包含 B 的引用类型,那么您将获得 B 类型的返回 . 否则,如果 B 是值类型,则返回类型是类型为 B 的可为空的包装 . 所以,这是对你的问题的简短回答 .

    说到这一点,在你的情况下,因为你回来了 bool ,所以's understandable that it'将被包装为 bool? . 知道这一点,您应该像通常使用 bool? 一样使用它 . 一种方法是简单地与 bool 的期望值进行相等比较 .

    例如:

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

    它比以下更短,更容易阅读:

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

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

  • 0

    您始终可以使用 null coalesce operator

    if (Employee?.IsTerminated ?? false) { /*do something here*/ }
    

相关问题