现有集合的C#集合初始化语法

时间:2019-01-30 12:56:15

标签: c#

我最近发现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
}

1 个答案:

答案 0 :(得分:3)

  

我想使用这种语法初始化它(即使Bars是只读的)

您根本无法。

因为我们使用的是初始化程序语法,并且实际上调用了属性的setter方法(即set),所以您有一个 readonly 属性,该属性只能由类本身设置,并且在类外设置它的形式,我们需要在创建它的实例时通过Foo的构造函数传递它。

更新:

第一个示例代码实际上结束了对Add的{​​{1}}方法的调用。它将编译为以下代码:

List<T>

虽然您可以向 Foo foo = new Foo(); foo.Bars.Add(new Bar()); 添加新项目,但是由于具有只读属性,因此无法使用初始化程序直接更改指向其他对象的引用,而调用{{ 1}},例如BarsList<Bar>