你可以像这样初始化一个数组:
int [ ] arr = { 1, 2, 3, 4, 5 };
但List
不允许这样:
Listlist = { 1, 2, 3, 4, 5 };
这背后的原因是什么?
毕竟两者都允许这样:
int [ ] arr = new int [ ] { 1, 2, 3, 4, 5 }; Listlist = new List { 1, 2, 3, 4, 5 };
也是为什么不能用LinkedList
?做到这一点?:
LinkedListll = new LinkedList () { 1, 2, 3 };
更新
多谢你们.刚看到回复.我想选择几个答案,但它并没有让我这么做.
为什么LinkedList通过显式实现有一个Add方法?这可能会被修复吗?因为这样的问题在被忽视时会变成更大的问题,对吧?
您的第一个示例是用于初始化整数数组的标准语言语法.左侧值的计算结果为int [].在第二个示例中,您尝试将int []分配给List
正如@Patrik所说,这对LinkedList不起作用,因为它没有将Add()方法定义为其接口的一部分(有一个ICollection.Add的显式实现),因此语法糖将不起作用.
但是,LinkedList有一个简单的解决方法.
public class LinkedListWithInit: LinkedList { public void Add( T item ) { ((ICollection )this).Add(item); } } LinkedList list = new LinkedListWithInit { 1, 2, 3, 4, 5 };
以下是C#3.0语言规范对此主题的评论:
以下是包含集合初始值设定项的对象创建表达式的示例:
Listdigits = new List { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 应用集合初始值设定项的集合对象必须是实现System.Collections.IEnumerable的类型,否则会发生编译时错误.对于按顺序的每个指定元素,集合初始值设定项在目标对象上调用Add方法,并将元素初始值设定项的表达式列表作为参数列表,为每次调用应用正常的重载决策.因此,集合对象必须包含每个元素初始值设定项的适用Add方法.
当你想到它时,这是有道理的.编译器确保您正在处理实现Add函数的可枚举类型(通过它执行初始化).