为什么C#6.0在使用Null传播运算符时不允许设置非null可空结构的属性?

时间:2015-06-24 19:12:18

标签: c# compiler-errors c#-6.0

假设我们有以下代码:

struct Article
{
    public string Prop1 { get; set; }
}

Article? art = new Article();
art?.Prop1 = "Hi"; // compile-error

编译错误是

  

CS0131作业的左侧必须是变量,属性或索引器。

实际上art?.Prop1是属性,应被视为有效的作业! 我没有看到任何分配问题导致此代码无效。

为什么C#6.0不允许设置非null可空结构的属性?
或者,任何建议一个行代码使分配有效将不胜感激。

2 个答案:

答案 0 :(得分:17)

此代码:

Article? art

将定义Nullable<Article>,但稍后会执行以下操作:

art?.Prop1 = "Hi";

这意味着使用Null传播/条件运算符。

空传播/条件运算符用于访问属性,而不是设置它们。因此你不能使用它。

正如@Servy在评论中所说,Null条件运算符的结果始终是一个值,您无法为值赋值,因此也就是错误。

如果您只是尝试设置属性,那么您不需要?对象名称,在声明时使用带有?类型的Nullable<T>,这是语法糖:

Nullable<Article> art; //same as Article? art

答案 1 :(得分:0)

Article? artNullable<Article> art的快捷方式 要分配属性,您需要访问.Value的{​​{1}}字段。通常,您需要确保art不为空:

Nullable<T>