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

Moh*_*kar 9 c# compiler-errors c#-6.0

假设我们有以下代码:

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

Article? art = new Article();
art?.Prop1 = "Hi"; // compile-error
Run Code Online (Sandbox Code Playgroud)

编译错误是

CS0131赋值的左侧必须是变量,属性或索引器.

实际上art?.Prop1是一个属性,应该被视为一个有效的任务!
我没有看到任何分配使这段代码无效的问题.

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

Hab*_*bib 17

这段代码:

Article? art
Run Code Online (Sandbox Code Playgroud)

你会定义一个Nullable<Article>但后来当你这样做:

art?.Prop1 = "Hi";
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Nullable<Article> art; //same as Article? art
Run Code Online (Sandbox Code Playgroud)

  • 问题仍然是为什么不允许这样做.编译器可能会注意到它是一个赋值,然后使用null传播运算符返回变量/属性而不是值或者我忽略了什么?可以在执行赋值之前通过省略空检查来简化代码. (4认同)
  • 或者在技术上说同样的事情,null传播运算符的结果总是一个值,而不是变量,这就是为什么他得到的错误说他不能为值赋值,因为它不是变量. (3认同)
  • 由于您已经可以调用像 x?.SetValue(...) 这样的方法,因此属性分配(这是同一件事)应该是一个有效的选项。为什么不? (2认同)