C# 组合列表初始值设定项和对象初始值设定项

C# 组合列表初始值设定项和对象初始值设定项,c#,.net,object-initializers,collection-initializer,C#,.net,Object Initializers,Collection Initializer,是否可以同时组合列表初始值设定项和对象初始值设定项? 给定以下类定义: 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 doe

是否可以同时组合列表初始值设定项和对象初始值设定项? 给定以下类定义:

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 };
类MyList:列表
{
公共字符串文本{get;set;}
}
//我们可以做到
var obj1=new MyList(){Text=“Hello”};
//我们也可以这样做
var obj2=new MyList(){1,2,3};
//但是这个没有编译
//var obj3=new MyList(){Text=“Hello”,1,2,3};

这是设计的还是仅仅是c编译器的一个bug或缺少的功能?

不,看看c规范第7.6.10节中的定义,
对象或集合初始值设定项
表达式要么是
对象初始值设定项
要么是
集合初始值设定项

对象初始值设定项
由多个
成员初始值设定项
组成,每个成员初始值设定项的形式为
初始值设定项=初始值设定项值
,而
集合初始值设定项
由多个
元素初始值设定项
组成,每个成员初始值设定项都是
非赋值表达式

所以它看起来像是设计出来的——可能是为了简单。老实说,我不能说我曾经想这么做。(我通常不会从<代码>列表开始,而是编写它。)我真的不想看到:

var obj3 = new MyList { 1, 2, Text = "Hello", 3, 4 };
编辑:如果您真的想启用此功能,可以将其放入类中:

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

不,这不是虫子。这是语言的设计

当你写作时

var obj1 = new MyList() { Text="Hello" };
var obj2 = new MyList() { 1, 2, 3 };
编译器会有效地将其转换为

MyList temp = new MyList();
temp.Text = "Hello";
MyList obj = temp;
MyList temp = new MyList();
temp.Add(1);
temp.Add(2);
temp.Add(3);
MyList obj2 = temp;
当你写作时

var obj1 = new MyList() { Text="Hello" };
var obj2 = new MyList() { 1, 2, 3 };
编译器会有效地将其转换为

MyList temp = new MyList();
temp.Text = "Hello";
MyList obj = temp;
MyList temp = new MyList();
temp.Add(1);
temp.Add(2);
temp.Add(3);
MyList obj2 = temp;
请注意,在第一种情况下,您使用的是对象初始值设定项,但在第二种情况下,您使用的是集合初始值设定项。没有对象和集合初始化器这样的东西。您正在初始化对象的属性,或者正在初始化集合。你不能两者都做,这是故意的


此外,您不应该从
列表
派生。请参阅:

如果您想得到类似于此功能的东西,请考虑构造构造函数参数:

var x = new CustomList("Hello World") { 1, 2, 3 }

我知道它是怎么翻译的。我仍然看不出为什么我们不能将第一个参数与后一个参数结合起来。但是如果我有很多参数,但在大多数情况下只想设置其中的几个参数,这并不是最好的解决方案。规范应该强制对象初始值设定项部分和列表初始值设定项部分一个接一个,而不是交错:)@Tejs:不,你不会。它使用了一个嵌入式集合初始值设定项。我是不是遗漏了什么?该语句相当于
var x=new MyList();x、 Text=“你好”;x、 值=新列表{1,2,3,4}
?看起来你需要一套。@Tejs:不,不是。。。在何处创建新的
列表
?这(大部分)就像说
var x=new MyList();x、 Text=“你好”;x、 增加(1);x、 添加(2)试试:)@Jon Skeet:让一个属性自动返回的有趣想法:)