不允许使用 `?` 检查 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));
为什么使用 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));