Null Conditioning运算符不能用于赋值?

时间:2016-09-02 16:53:39

标签: c# c#-6.0

请查看以下代码,并帮助我直观地了解我收到编译器错误的原因。

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; }
}

我是否应该推断出空调节仅用于访问属性,变量等而不是用于分配?

注意:我已经提到过类似的帖子(链接如下),但在我看来,没有进行足够的讨论。Why C# 6.0 doesn't let to set properties of a non-null nullable struct when using Null propagation operator?

编辑: 我期待像

这样的东西
If(null!= smpl) 
{ 
smpl.isExtended = true; 
}

似乎我的期望是不对的!

2 个答案:

答案 0 :(得分:5)

您的扣除是正确的。空条件运算符仅适用于成员访问,而不适用于赋值。

那就是说,我倾向于同意语言/编译器应该允许运算符用于属性赋值(而不是字段),因为属性赋值实际上被编译为方法调用。

编译的属性赋值如下所示:

smpl?.set_isExtended(true); 

这将是完全有效的代码。

另一方面,很容易认为它会引入当前不存在的属性和字段用法之间的语法差异,以及使代码更难以推理。

您还可以访问codeplex上的大部分C# 6.0 design notes。我做了一个粗略的扫描,无条件讨论跨越了许多部分。

答案 1 :(得分:3)

考虑这一行代码的含义:

smpl?.isExtended = true;

如果smpl null,您将尝试为null分配值。哪个没有意义。

只需分配值,就不需要在那里进行空检查:

smpl.isExtended = true;

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

var x = someObject?.someProperty;

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

相反,这是什么意思?:

someObject?.someProperty = x;

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

null = x;