为什么空条件运算符会更改常规属性访问?

Blu*_*eft 4 c# null-conditional-operator safe-navigation-operator

我很困惑null条件运算符如何与普通属性访问级联.拿这两个例子:

a?.b.c
(a?.b).c
Run Code Online (Sandbox Code Playgroud)

我希望它们是等价的:首先,a?.b评估值,然后result.c进行评估.因此,如果a == null应该抛出异常.

但是,这只发生在第二个表达式中.第一个表达式求值为null,意思是它相同a?.b?.c.为什么?

SO *_*ood 9

这只是运营商优先权的问题.让我们来看看案例:

一个?.BC

  1. 返回Evaluate a=> null,在空条件运算符短路的情况下,不评估任何其他内容.

(一?.B).C

  1. 返回Evaluate a=>null
  2. 评估((B)null).c=> NullReferenceException被抛出

对于这些相同的情况,您应该进行比较

  1. a?.b.c
  2. (a?.b)?.c
  3. a?.b?.c (正如你已经提到的那样)