为什么使用新 ?
运算符为预检设置一个非空值不可用于分配?
例如:
var list = // ... Some list
var entry = list.FirstOrDefault();
entry?.Value = 123;
由于错误而无法编译:
作业的左侧必须是变量,属性或索引器。
但是调用方法或其他东西是有效的。
这种编译器行为的原因是什么?
答案 0 :(得分:6)
C#编译器肯定可以通过声明一旦?
的链计算为null
,所有进一步的处理停止来使这个语句起作用。
然而,问题是当右侧有副作用时该怎么办:
entry?.Value = CallSomeFunctionWithSideEffects(123);
当始终评估右侧时,其语义与其他分配完全不同。但是,在这里,需要推迟对右侧的评估,直到知道左侧产生非null
值。
函数调用不会遇到同样的问题,因为调用目标是在参数之前处理的:
entry?.SetValue(CallSomeFunctionWithSideEffects(123));
答案 1 :(得分:2)
因为entry?.Value
可能评估为null
。
然后你的代码相当于
null = 123;
无效。