编译器错误-为什么C#6.0没有';t允许在使用null传播运算符时设置不可为null的结构的属性

本文关键字:null 运算符 传播 设置 属性 结构 C#6 为什么 错误 没有 编译器 | 更新日期: 2023-09-27 17:59:45

假设我们有以下代码:

struct Article
{
    public string Prop1 { get; set; }
}
Article? art = new Article();
art?.Prop1 = "Hi"; // compile-error

编译错误为

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

实际上art?.Prop1是一个属性,应该被视为一个有效的赋值
我认为赋值使此代码无效没有任何问题。

为什么C#6.0不允许设置不可为null的结构的属性
或者,任何关于一行代码使分配有效的建议都将受到赞赏。

编译器错误-为什么C#6.0没有';t允许在使用null传播运算符时设置不可为null的结构的属性

此代码:

Article? art

将定义Nullable<Article>,但稍后定义时:

art?.Prop1 = "Hi";

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

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

正如@Servy在评论中所说,Null条件运算符的结果始终是一个值,并且不能为值赋值,因此出现了错误。

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

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

Article? artNullable<Article> art的快捷方式要分配属性,您需要访问Nullable<T>.Value字段。在一般情况下,你需要确保艺术不是空的:

if (art.HasValue)
{
    art.Value.Prop1 = "Hi"; 
}