C# 列表<;T>;构造函数(IEnumerable<;T>;)不';不接受从array.CreateInstance(类型,Int32)创建的数组

C# 列表<;T>;构造函数(IEnumerable<;T>;)不';不接受从array.CreateInstance(类型,Int32)创建的数组,c#,.net,arrays,C#,.net,Arrays,我是编程和.net的新手,我很难理解为什么使用列表(IEnumerable)构造函数接受使用[]创建的数组,但不接受使用数组创建的数组。CreateInstance(Type,Int32) 以下是有效的方法: DirectoryInfo[] dirsArray = foo.GetDirectories(); List<DirectoryInfo> dirsList = new List<DirectoryInfo>(dirsArray); DirectoryInfo[]

我是编程和.net的新手,我很难理解为什么使用
列表(IEnumerable)
构造函数接受使用
[]
创建的数组,但不接受使用
数组创建的数组。CreateInstance(Type,Int32)

以下是有效的方法:

DirectoryInfo[] dirsArray = foo.GetDirectories();
List<DirectoryInfo> dirsList = new List<DirectoryInfo>(dirsArray);
DirectoryInfo[]dirsArray=foo.GetDirectories();
List dirsList=新列表(dirsArray);
以下是不需要的:

 Array dirsArray = Array.CreateInstance(typeof(DirectoryInfo), 10); //assume we know 10 is the required length
 List<DirectoryInfo> dirsList = new List<DirectoryInfo>(dirsArray);
Array dirsArray=Array.CreateInstance(typeof(DirectoryInfo),10)//假设我们知道10是所需的长度
List dirsList=新列表(dirsArray);
上面给出了以下编译器错误:

Error   1   The best overloaded method match for 'System.Collections.Generic.List<System.IO.DirectoryInfo>.List(System.Collections.Generic.IEnumerable<System.IO.DirectoryInfo>)' has some invalid arguments

Error   2   Argument 1: cannot convert from 'System.Array' to 'System.Collections.Generic.IEnumerable<System.IO.DirectoryInfo>'
错误1“System.Collections.Generic.List.List(System.Collections.Generic.IEnumerable)”的最佳重载方法匹配具有一些无效参数
错误2参数1:无法从“System.Array”转换为“System.Collections.Generic.IEnumerable”
但是我知道
List(IEnumerable)
可以接受任何
IEnumerable
作为参数。我知道
System.Array
IEnumerable
。这不仅是因为它在参考中,而且因为第一个使用
[]
构造函数语法的示例工作正常


那么这里的问题是什么?是否
Array.CreateInstance
以某种方式创建了一个不可
IEnumerable
的数组?

因为
数组。CreateInstance(Type,Int32)
不返回
IEnumerable
实例,它返回一个
数组
对象。如果使用[]创建数组,它将是一个
IEnumerable


请看一下这个线程,它很有说明性:

Array
类本身不是一个
IEnumerable
。您需要强制转换
Array.CreateInstance的结果

var dirsArray = (DirectoryInfo[]) Array.CreateInstance(typeof(DirectoryInfo), 10);
Array
是所有数组类型的基类,并且在运行时提供了
IEnumerable
的实现。因此不可能在编译时将数组用作
IEnumerable
。从

从.NET Framework 2.0开始,Array类实现了
System.Collections.Generic.IList
System.Collections.Generic.ICollection
System.Collections.Generic.IEnumerable
通用接口实现在运行时提供给数组,因此,通用接口不会出现在数组类的声明语法中


Array.CreateInstance
返回一个非类型化的,正如您所注意到的,它没有实现
IEnumerable
(它不是泛型的),因此不能与
列表
构造函数一起使用

但是,
Array.CreateInstance
实际返回的是类型化的,您只需将其转换为所需的类型(所有类型化的数组都是从基
Array
类派生的)。所以你可以这样做:

List<DirectoryInfo> dirsList = new List<DirectoryInfo>((DirectoryInfo[])dirsArray);
因为
ControlCollection
(以及框架中的许多旧的、前泛型的集合)不是从
数组中派生出来的。在这种情况下,由于
ControlCollection
实现了
IEnumerable
,因此可以使用扩展方法:

var lst = new List<Control>(myControlCollection.Cast<Control>());
var lst=新列表(myControlCollection.Cast());

如果框架中的许多集合类实现了
IEnumerable
,则可以使用此技巧。再举一个例子。

因为
Array.CreateInstance
返回了一个非类型化的
Array
,它没有实现
IEnumerable
。您使用
Array.CreateInstance
试图解决什么问题?我个人从来没有发现过它的用途。实际上我想把ControlCollection转换成List,但不知道怎么做。因此,我添加了一个步骤,先将其转换为数组,然后再将其转换为列表。这是我不理解的部分。在CreateInstance的引用中,它只是声明返回System.Array。没有提到它没有任何不同。在System.Array的引用中,它清楚地指出它是IEnumerable。它是IEnumerable,而不是IEnumerable@GarryWong这是两个不同的东西。哦!好吧,这就是我错过的。谢谢:)
var lst = new List<Control>(myControlCollection.Cast<Control>());