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)
语法
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)