C# 不支持逻辑评估中的简写、空条件检查是否有原因?
Is there a reason C# doesn't support short-hand, null-conditional checking in logical evaluations?
我经常发现自己在编写代码时先检查 null
,然后再检查 属性 的值。最简单的形式是:
if (someInstance != null && someInstance.SomeBooleanProperty)
有什么原因我们不能使用空条件运算符 (?.
) 来简化检查它后面的 属性 是否是这样的布尔值?
if (someInstance?.SomeBooleanProperty)
上面的示例不会编译,因为它的计算结果为 null
,而不是 true
或 false
,因此您会收到一条错误消息,指出 [= 没有可用的隐式转换18=] 到 bool
.
我们总是可以转换或直接检查一个值,例如:
if (someInstance?.SomeBooleanProperty == false)
这很好用,老实说,它并没有那么多额外的代码。只是,在我看来,随着 C# 多年来引入的所有简化,我不禁想知道是否有理由我们仍然不能像这样使用 shorthand null 条件?
我认为单独使用 ?.
的固有问题是当 someInstance
为空时条件的计算结果是什么。这就是编译器抱怨的原因以及为什么您需要空检查条件和非空布尔值评估的原因。 someInstance?.SomeBooleanProperty ?? false
将同时满足这两个条件。 ?.
不能/不应该单独推断这个逻辑。
我经常发现自己在编写代码时先检查 null
,然后再检查 属性 的值。最简单的形式是:
if (someInstance != null && someInstance.SomeBooleanProperty)
有什么原因我们不能使用空条件运算符 (?.
) 来简化检查它后面的 属性 是否是这样的布尔值?
if (someInstance?.SomeBooleanProperty)
上面的示例不会编译,因为它的计算结果为 null
,而不是 true
或 false
,因此您会收到一条错误消息,指出 [= 没有可用的隐式转换18=] 到 bool
.
我们总是可以转换或直接检查一个值,例如:
if (someInstance?.SomeBooleanProperty == false)
这很好用,老实说,它并没有那么多额外的代码。只是,在我看来,随着 C# 多年来引入的所有简化,我不禁想知道是否有理由我们仍然不能像这样使用 shorthand null 条件?
我认为单独使用 ?.
的固有问题是当 someInstance
为空时条件的计算结果是什么。这就是编译器抱怨的原因以及为什么您需要空检查条件和非空布尔值评估的原因。 someInstance?.SomeBooleanProperty ?? false
将同时满足这两个条件。 ?.
不能/不应该单独推断这个逻辑。