集合初始化

Joa*_*nge 7 .net c#

你可以像这样初始化一个数组:

int [ ] arr = { 1, 2, 3, 4, 5 }; 
Run Code Online (Sandbox Code Playgroud)

List<T>不允许这样:

List<int> list = { 1, 2, 3, 4, 5 }; 
Run Code Online (Sandbox Code Playgroud)

这背后的原因是什么?

毕竟两者都允许这样:

int [ ] arr = new int [ ] { 1, 2, 3, 4, 5 }; 

List<int> list = new List<int> { 1, 2, 3, 4, 5 }; 
Run Code Online (Sandbox Code Playgroud)

也是为什么不能用LinkedList<T>?做到这一点?:

LinkedList<int> ll = new LinkedList<int>() { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

更新

多谢你们.刚看到回复.我想选择几个答案,但它并没有让我这么做.

为什么LinkedList通过显式实现有一个Add方法?这可能会被修复吗?因为这样的问题在被忽视时会变成更大的问题,对吧?

tva*_*son 15

您的第一个示例是用于初始化整数数组的标准语言语法.左侧值的计算结果为int [].在第二个示例中,您尝试将int []分配给List <int>.赋值运算符不支持它,因为它们是不同的类型.List <int> 不是 int类型的数组.正如你所说的,有一个List <int>的构造函数,它确实将int []作为参数,并且在C#3.0中添加的新语法糖允许您使用{}将成员添加到由默认构造函数.

正如@Patrik所说,这对LinkedList不起作用,因为它没有将Add()方法定义为其接口的一部分(有一个ICollection.Add的显式实现),因此语法糖将不起作用.

但是,LinkedList有一个简单的解决方法.

public class LinkedListWithInit<T> : LinkedList<T>
{
    public void Add( T item )
    {
        ((ICollection<T>)this).Add(item);
    }
}

LinkedList<int> list = new LinkedListWithInit<int> { 1, 2, 3, 4, 5 };
Run Code Online (Sandbox Code Playgroud)


Jas*_*son 7

以下是C#3.0语言规范对此主题的评论:

以下是包含集合初始值设定项的对象创建表达式的示例:

List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Run Code Online (Sandbox Code Playgroud)

应用集合初始值设定项的集合对象必须是实现System.Collections.IEnumerable的类型,否则会发生编译时错误.对于按顺序的每个指定元素,集合初始值设定项在目标对象上调用Add方法,并将元素初始值设定项的表达式列表作为参数列表,为每次调用应用正常的重载决策.因此,集合对象必须包含每个元素初始值设定项的适用Add方法.

当你想到它时,这是有道理的.编译器确保您正在处理实现Add函数的可枚举类型(通过它执行初始化).