[英]Checking for null and set value is not allowed using `?`
为什么使用新设置值?
用于预检查非空的运算符不能用于赋值?
例如:
var list = // ... Some list
var entry = list.FirstOrDefault();
entry?.Value = 123;
由于错误,这不会编译:
赋值的左侧必须是变量,属性或索引器。
但是调用方法或其他东西是有效的。
这种编译器行为的原因是什么?
C#编译器肯定可以通过声明一旦链的?
s计算为null
,所有进一步处理停止。
然而,问题是当右侧有副作用时该怎么办:
entry?.Value = CallSomeFunctionWithSideEffects(123);
当总是评估右侧时,这与其他任务的语义完全不同。 然而,在这里,需要推迟对右侧的评估,直到已知左侧产生非null
值。
函数调用不会遇到同样的问题,因为调用目标是在参数之前处理的:
entry?.SetValue(CallSomeFunctionWithSideEffects(123));
因为entry?.Value
可能会评估为null
。
那么你的代码相当于
null = 123;
这是无效的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.