在检查条件时,null 条件是否有可能不 return 可为 null 的值类型?
Is it possible for null-conditionals to not return nullable value types while checking conditions?
从空条件赋值时, 到 return 可空值类型是有意义的。否则,如果对象为 null,则 null 条件将 return 值类型的默认值,而您不希望这样。因此,这很好:
bool? IsTerminated = Employee?.IsTerminated;
但是,如果我只是检查条件,为什么它 return 是可为 null 的类型?你会认为编译器可以很好地解决这个问题:
if (Employee?.IsTerminated) { /*do something here*/ }
毕竟,它只是编译到这个,对吧?
if (Employee != null && Employee.IsTerminated) { /*do something here*/ }
为了让它工作,我必须这样做:
if ((Employee?.IsTerminated).GetValueOrDefault()) { /*do something here*/ }
在额外的代码和必须用括号括起表达式之间,null 条件的简写语法的全部目的似乎被打败了。这是处理空条件 return 值的正确方法,还是有另一种不涉及可为空 return 值计算的方法?
如果 A?.B
包含引用类型的 B
,那么您将得到类型 B
的 return。否则,如果 B
是值类型,则 return 类型是围绕类型 B
的可空包装。所以,这是对你问题的简短回答。
话虽如此,在您的情况下,由于您返回的是 bool
,因此将其包装为 bool?
是可以理解的。知道了这一点,您应该像通常使用 bool?
一样简单地使用它。一种方法是简单地与 bool
.
的期望值进行相等比较
例如:
if (Employee?.IsTerminated == true) { }
它比:
更短更易读
if ((Employee?.IsTerminated).GetValueOrDefault()) { }
示例比较有效,因为 null
永远不会等于 bool
。
您始终可以使用 空合并运算符:
if (Employee?.IsTerminated ?? false) { /*do something here*/ }
从空条件赋值时, 到 return 可空值类型是有意义的。否则,如果对象为 null,则 null 条件将 return 值类型的默认值,而您不希望这样。因此,这很好:
bool? IsTerminated = Employee?.IsTerminated;
但是,如果我只是检查条件,为什么它 return 是可为 null 的类型?你会认为编译器可以很好地解决这个问题:
if (Employee?.IsTerminated) { /*do something here*/ }
毕竟,它只是编译到这个,对吧?
if (Employee != null && Employee.IsTerminated) { /*do something here*/ }
为了让它工作,我必须这样做:
if ((Employee?.IsTerminated).GetValueOrDefault()) { /*do something here*/ }
在额外的代码和必须用括号括起表达式之间,null 条件的简写语法的全部目的似乎被打败了。这是处理空条件 return 值的正确方法,还是有另一种不涉及可为空 return 值计算的方法?
如果 A?.B
包含引用类型的 B
,那么您将得到类型 B
的 return。否则,如果 B
是值类型,则 return 类型是围绕类型 B
的可空包装。所以,这是对你问题的简短回答。
话虽如此,在您的情况下,由于您返回的是 bool
,因此将其包装为 bool?
是可以理解的。知道了这一点,您应该像通常使用 bool?
一样简单地使用它。一种方法是简单地与 bool
.
例如:
if (Employee?.IsTerminated == true) { }
它比:
更短更易读if ((Employee?.IsTerminated).GetValueOrDefault()) { }
示例比较有效,因为 null
永远不会等于 bool
。
您始终可以使用 空合并运算符:
if (Employee?.IsTerminated ?? false) { /*do something here*/ }