c# - 为什么 null 条件运算符会更改常规属性访问?

标签 c# null-conditional-operator safe-navigation-operator

我对空条件运算符如何与普通属性访问级联感到困惑。举这两个例子:

a?.b.c
(a?.b).c

我希望它们是等价的:首先,计算 a?.b 的值,然后计算 result.c。因此,如果 a == null,则应抛出异常。

但是,这只发生在第二个表达式中。第一个表达式的计算结果为 null,这意味着它与 a?.b?.c 相同。 为什么?

最佳答案

这只是运算符优先级的问题。让我们来看看案例:

a?.b.c

  1. Evaluate a => null 被返回,鉴于 the null-conditional operators are short-circuiting,没有其他任何东西被评估.

(a?.b).c

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

为了使这些情况等同,您应该进行比较

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

关于c# - 为什么 null 条件运算符会更改常规属性访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51640497/

相关文章:

c# - 在递归方法中使用 async/await 的正确方法是什么?

javascript 忽略-if-null 运算符?

c# - 为什么我必须在 null 条件表达式周围放置 () 才能使用正确的方法重载?

c# - 类型转换调用链中的 Elvis 运算符

ruby - NilCheck 修复了安全导航运算符 (&.)

C#:关于接口(interface)、实现和继承的困惑

c# - 空指针异常我无法解决

c# - 从 sql 存储过程加载和调用 C#(程序集)