编译器错误-为什么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的结构的属性
或者,任何关于一行代码使分配有效的建议都将受到赞赏。
此代码:
Article? art
将定义Nullable<Article>
,但稍后定义时:
art?.Prop1 = "Hi";
这意味着使用Null传播/条件运算符。
Null传播/条件运算符用于访问属性,而不是设置属性。因此你不能使用它。
正如@Servy在评论中所说,Null条件运算符的结果始终是一个值,并且不能为值赋值,因此出现了错误。
如果您只是试图设置属性,那么您不需要具有对象名称的?
,在声明时使用具有Nullable<T>
类型的?
,这是的语法糖
Nullable<Article> art; //same as Article? art
Article? art
是Nullable<Article> art
的快捷方式要分配属性,您需要访问Nullable<T>
的.Value
字段。在一般情况下,你需要确保艺术不是空的:
if (art.HasValue)
{
art.Value.Prop1 = "Hi";
}