实例化列表

Instantiating a List

如果我想实例化一个数组,语法是

int[] items = new int[] { 1, 2, 3 };

快捷方式是

int[] items = {1,2,3};

现在我想对 List.

做同样的事情

问题:

为什么这样做:

List<int> items = new int[] { 1, 2, 3 }.ToList();

但不是这个:

List<int> items = { 1, 2, 3 }; //invalid

List<int> items = { 1, 2, 3 }.ToList(); //invalid

语法

int[] array = {1,2,3};

数组初始化的特殊语法糖。 {1,2,3} 本身还不是一个数组。

这一行

List<int> list = new[] {1,2,3}.ToList();

之所以有效,是因为 表达式 new[] {1,2,3} returns 一个 int[],它实现了 IEnumerable<int>,因此您可以调用 ToList()就可以了。

在规范中,这就是 12.6 Array initializers and 7.5.10.2 Array creation expressions

之间的区别

List<T> 有一个构造函数,它将 IEnumerable<T> 作为参数来初始化列表的内容。所以你可以调用

List<int> list = new List<int>(new[]{1,2,3});

或使用集合初始化器语法糖:

List<int> list = new List<int> {1,2,3};

编译器将其转换为如下形式:

var tmp = new List<int>();
tmp.Add(1);
tmp.Add(2);
tmp.Add(3);
List<int> list = tmp;