请查看以下代码,并帮助我直观地了解我收到编译器错误的原因。
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;
}
似乎我的期望是不对的!
答案 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;