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



假设我们有以下代码:

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

编译错误为

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

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

为什么C#6.0不允许设置不可为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"; 
}

最新更新