我最近发现了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
}
我想使用此语法初始化它(即使Bars是只读的)
你根本不能。
因为我们使用的是初始化程序语法,并且实际上调用该set
属性的setter方法,所以您拥有一个只读属性,该属性只能由类本身设置,并且要在类外设置它的形式,我们需要通过Foo
while的构造函数进行传递创建它的实例。
第一个示例代码实际上结束了对的Add
方法的调用List<T>
。它将编译为以下代码:
Foo foo = new Foo();
foo.Bars.Add(new Bar());
虽然可以增加新的项目到Bars
,但你不能直接用初始化它的参考点更改为不同的对象,由于只读属性,而这是完全合法的调用的成员方法List<Bar>
像实例Remove
,Find
等等。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句