组合List初始化器和对象初始化器

cod*_*nix 16 .net c# object-initializers collection-initializer

是否可以同时组合List初始化器和对象初始化器?给定以下类定义:

class MyList : List<int>
{
    public string Text { get; set; }
}

// we can do this
var obj1 = new MyList() { Text="Hello" };

// we can also do that
var obj2 = new MyList() { 1, 2, 3 };

// but this one doesn't compile
//var obj3 = new MyList() { Text="Hello", 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

这是设计还是仅仅是c#编译器的错误或缺失功能?

Jon*_*eet 27

否,从C#规范的部分7.6.10看的定义,一个object-or-collection-initializer表达式是一个object-initializer 一个collection-initializer.

一个object-initializer由多个member-initializers 组成,每个都是形式,initializer = initializer-value而a collection-initializer由多个element-initializers 组成,每个s是a non-assigment-expression.

所以看起来它是设计的 - 可能是为了简单起见.说实话,我不能说我曾经想过这样做.(我通常不会从一List<int>开始 - 我会把它组成.)我真的很讨厌看到:

var obj3 = new MyList { 1, 2, Text = "Hello", 3, 4 };
Run Code Online (Sandbox Code Playgroud)

编辑:如果你真的,真的想要启用它,你可以把它放在课堂上:

class MyList : List<int>
{
    public string Text { get; set; }
    public MyList Values { get { return this; } }
}
Run Code Online (Sandbox Code Playgroud)

那时你可以写:

var obj3 = new MyList { Text = "Hello", Values = { 1, 2, 3, 4 } };
Run Code Online (Sandbox Code Playgroud)

  • @Jon Skeet:有趣的想法让一个物业回归:) (2认同)