不允许使用 `?` 检查 null 和设置值

Checking for null and set value is not allowed using `?`

为什么使用 new ? 运算符设置值用于 pre-checking of not null 不适用于作业?

例如:

var list = // ... Some list
var entry = list.FirstOrDefault();
entry?.Value = 123;

由于以下错误无法编译:

The left-hand side of an assignment must be a variable, property or indexer.

但是调用方法或其他东西是可行的。

这种编译器行为的原因是什么?

因为 entry?.Value 可能计算为 null

那么你的代码就等同于

null = 123;

无效。

C# 编译器肯定可以通过声明一旦 ?s 的链评估为 null,所有进一步的处理都会停止,从而使该语句起作用。

问题是,右边出现副作用时怎么办:

entry?.Value = CallSomeFunctionWithSideEffects(123);

当右侧总是被评估时,它的语义与其他分配有很大不同。然而,在这里,右侧的评估需要推迟,直到已知左侧产生非 null 值。

函数调用不会遇到同样的问题,因为调用目标在参数之前被处理:

entry?.SetValue(CallSomeFunctionWithSideEffects(123));