【发布时间】:2021-01-28 06:04:41
【问题描述】:
如果我有以下没有设置器或支持字段的属性
public List<string> TestProperty => new List<string> {"one", "two"};
并尝试在对象初始化器中使用
TestProperty = new List<string> {"three", "four"}
我得到了预期的错误:
[CS0200] Property or indexer 'X.TestProperty' cannot be assigned to -- it is read only
但是,如果我尝试在对象初始化器中使用
TestProperty = { "three", "four" }
一切编译正常,但该属性仍返回 new List<string> {"one", "two"};。
@jon-skeet 在this 回答中解释说,第二种形式是 nested object initialiser 但我仍然不确定为什么上述(无用)编译以及是否可以停止和从对象初始化程序中的 IDE 自动完成(ReSharper)中删除的属性?这只会让我的代码的用户感到沮丧。
编辑:注意我不想初始化这个属性,我担心编译器允许一些看起来像初始化的事情发生。
【问题讨论】:
-
好吧,
TestProperty确实返回了一个初始化的List<T>,因此您可以安全地向其中添加数据。数据不分配给TestProperty只是您的决定。 -
请注意,
x.TestProperty == x.TestProperty会给你一个惊喜。创建一个新集合通常应该是一个方法而不是一个属性。 -
除此之外,在这个问题中出现类似问题对于公共 API 来说是一个糟糕的选择
-
@CamiloTerevinto“属性已初始化”通常意味着“有一个值分配给一个属性一次并且它保持这种方式(直到新的分配)”,您在“属性”的不太常见的意义上使用它总是返回一个非空值”...
-
我完全理解这个属性是一个没有设置器的计算属性。我试图理解为什么在对象初始化程序中允许使用该语法以及它在做什么......
标签: c# initializer