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

布鲁诺·布兰特(Bruno Brant)

我最近发现了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
}
埃桑·贾杰德(Ehsan Sajjad)

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

你根本不能。

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

更新:

第一个示例代码实际上结束了对的Add方法的调用List<T>它将编译为以下代码:

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

虽然可以增加新的项目到Bars,但你不能直接用初始化它的参考点更改为不同的对象,由于只读属性,而这是完全合法的调用的成员方法List<Bar>像实例RemoveFind等等。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章