我最近发现C#中有一种语法,使您可以在初始化期间初始化只读集合:
class Foo
{
public List<Bar> Bars { get; } = new List<Bar>();
}
var foo = new Foo
{
Bars =
{
new Bar()
}
}
这很棒,因为它可以产生非常有表现力的代码。但是我遇到的情况是我已经有Bar
的集合,并且我想使用这种语法对其进行初始化(即使Bars是readonly
)。 有办法吗?
var bar = new List<Bar>();
var foo = new Foo
{
Bars = bar // error: Property or indexer Foo.Bar cannot be assigned to -- it is read only
}
答案 0 :(得分:3)
我想使用这种语法初始化它(即使Bars是只读的)
您根本无法。
因为我们使用的是初始化程序语法,并且实际上调用了属性的setter方法(即set
),所以您有一个 readonly 属性,该属性只能由类本身设置,并且在类外设置它的形式,我们需要在创建它的实例时通过Foo
的构造函数传递它。
第一个示例代码实际上结束了对Add
的{{1}}方法的调用。它将编译为以下代码:
List<T>
虽然您可以向 Foo foo = new Foo();
foo.Bars.Add(new Bar());
添加新项目,但是由于具有只读属性,因此无法使用初始化程序直接更改指向其他对象的引用,而调用{{ 1}},例如Bars
,List<Bar>
等