为什么C#6.0在使用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
但稍后你会这样做:
art?.Prop1 = "Hi";
这将意味着使用Null传播/条件运算符。
空传播/条件运算符用于访问属性,而不是设置它们。 因此你不能使用它。
正如@Servy在评论中所说,Null条件运算符的结果始终是一个值,您无法为值赋值,因此也就是错误。
如果您只是想设置该属性,那么您不需要?
用对象名称, ?
在声明时使用Nullable
类型,这是语法糖:
Nullable art; //same as Article? art
Article? art
Article? art
是Nullable
的快捷方式。要分配您需要访问的属性。可以为Nullable
字段。 一般情况下,您需要确保艺术不是空的:
if (art.HasValue) { art.Value.Prop1 = "Hi"; }