繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM