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

时间:2016-05-12 09:50:08

标签: c# .net null roslyn

为什么使用 ?运算符为预检设置一个非空值不可用于分配?

例如:

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

由于错误而无法编译:

  

作业的左侧必须是变量,属性或索引器。

但是调用方法或其他东西是有效的。

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

2 个答案:

答案 0 :(得分:6)

C#编译器肯定可以通过声明一旦?的链计算为null,所有进一步的处理停止来使这个语句起作用。

然而,问题是当右侧有副作用时该怎么办:

entry?.Value = CallSomeFunctionWithSideEffects(123);

当始终评估右侧时,其语义与其他分配完全不同。但是,在这里,需要推迟对右侧的评估,直到知道左侧产生非null值。

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

entry?.SetValue(CallSomeFunctionWithSideEffects(123));

答案 1 :(得分:2)

因为entry?.Value可能评估为null

然后你的代码相当于

null = 123;

无效。