Null 条件运算符不能用于赋值?

Null Conditioning operator can't be used for assignments?

请查看以下代码并帮助我想象为什么我会收到编译器错误。

class Program
{
    static void Main(string[] args)
    {
        Sample smpl = GetSampleObjectFromSomeClass();

        //Compiler Error -- the left-hand side of an assignment must be a variable property or indexer
        smpl?.isExtended = true; 
    }
}

public class Sample
{
    public bool isExtended { get; set; }
}

我是否应该推断空条件仅用于访问属性、变量等而不用于赋值?

注意:我提到了类似的 post(下面的 link),但在我看来,讨论还不够。

编辑: 我期待

If(null!= smpl) 
{ 
smpl.isExtended = true; 
}

看来我的预期不对!

考虑这行代码的含义:

smpl?.isExtended = true;

如果 smpl null,您将尝试为 null 赋值。这没有意义。

直接赋值,不需要空检查:

smpl.isExtended = true;

基本上,空传播运算符用于读取值,而不是设置它们。考虑这行代码:

var x = someObject?.someProperty;

从概念上讲,这意味着如果 someObject 存在,x 将被赋予 someProperty 的值。如果它不存在(是 null)那么 x 将是 null.

反过来,这意味着什么?:

someObject?.someProperty = x;

从概念上讲,这意味着如果 someObject 存在,则将 someProperty 设置为 x。但如果它不存在(是 null),那么...将 null 设置为 x?这没有意义:

null = x;

你的推断是正确的。空条件运算符仅适用于成员访问,不适用于赋值。

也就是说,我倾向于同意 language/compiler 应该允许运算符用于 属性 赋值(但不是字段),因为 属性 赋值实际上是编译下来的到方法调用。

编译后的 属性 赋值看起来像:

smpl?.set_isExtended(true); 

这将是完全有效的代码。

另一方面,很容易提出这样的论点,即它会在 属性 和当前不存在的字段用法之间引入语法差异,并使代码更难推理。

您还可以访问 codeplex 上的大部分 C# 6.0 design notes。我粗略地浏览了一下,null 条件的讨论跨越了很多部分。