现有集合的C#集合初始值设定项语法

现有集合的C#集合初始值设定项语法,c#,C#,我最近发现C#中有一种语法,使您能够在初始化期间初始化只读集合: class Foo { public List<Bar> Bars { get; } = new List<Bar>(); } var foo = new Foo { Bars = { new Bar() } } 我想使用此语法初始化它(即使条形图是只读的) 你根本不能 由于我们使用的是初始值设定项语法,它实际上调用了属性的setter方法akaset,

我最近发现C#中有一种语法,使您能够在初始化期间初始化只读集合:

class Foo
{
    public List<Bar> Bars { get; } = new List<Bar>();
}

var foo = new Foo
{
    Bars = 
    {
        new Bar()
    }
}
我想使用此语法初始化它(即使条形图是只读的)

你根本不能

由于我们使用的是初始值设定项语法,它实际上调用了属性的setter方法aka
set
,您有一个readonly属性,该属性只能由类本身设置,为了在类外部设置它,我们需要在创建它的实例时通过
Foo
的构造函数传递它

更新: 第一个示例代码实际上以调用
List
Add
方法结束。它将编译为以下代码:

 Foo foo = new Foo();
 foo.Bars.Add(new Bar());

虽然您可以将新项目添加到
,但由于只读属性,您无法更改它的引用以直接使用初始值设定项指向不同的对象,而在实例上调用
列表
的成员方法(如
删除
)是完全合法的,
Find

如果您可以更改
Foo
,您只需添加一个将
List
作为参数的构造函数-
var Foo=new Foo(bar)
允许
Foo
构造函数将
Bar
作为参数,并更改为此
公共列表Bar={get;private set;}
添加setter或构造函数。无论是在类中内联赋值(无setter允许),还是从外部赋值,都是不同的。@LeonardoSeccia
private set
在c#5中很有用,但在c#6中,只需指定
{get;}
@LeonardoSeccia
私有集
就可以拥有只读属性。实际上,get-only属性不仅是只读的,而且是不可变的-您只能在类型的构造函数中设置它的值。这是我所期望的,但是您知道另一个示例(直接初始化它的示例)是如何工作的吗?我的猜测是,它正在调用集合的.Add成员。@BrunoBrant你能以小提琴作为工作示例吗?@BrunoBrant如果你是正确的,它会在内部将其转换为
Add
方法调用。
 Foo foo = new Foo();
 foo.Bars.Add(new Bar());