实例化列表

Tos*_*shi 2 c# arrays list instance

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

int[] items = new int[] { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

快捷方式是

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

现在我想对 a 做同样的事情List。

问题:

为什么这有效:

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

但不是这个:

List<int> items = { 1, 2, 3 }; //invalid
Run Code Online (Sandbox Code Playgroud)

或者

List<int> items = { 1, 2, 3 }.ToList(); //invalid
Run Code Online (Sandbox Code Playgroud)

Ren*_*ogt 5

语法

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

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

这条线

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

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

在规范中,这是12.6 数组初始值设定项和7.5.10.2 数组创建表达式之间的区别。


List<T>有一个构造函数,它接受一个IEnumerable<T>参数来初始化列表的内容。所以你可以打电话

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

或使用集合初始值设定项语法糖:

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

编译器将其转换为如下所示:

var tmp = new List<int>();
tmp.Add(1);
tmp.Add(2);
tmp.Add(3);
List<int> list = tmp;
Run Code Online (Sandbox Code Playgroud)