List <T>构造函数(IEnumerable <T>)不接受从Array.CreateInstance(Type,Int32)创建的数组

Gar*_*ong 2 .net c# arrays

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

这是有效的:

DirectoryInfo[] dirsArray = foo.GetDirectories();
List<DirectoryInfo> dirsList = new List<DirectoryInfo>(dirsArray);
Run Code Online (Sandbox Code Playgroud)

这不是:

 Array dirsArray = Array.CreateInstance(typeof(DirectoryInfo), 10); //assume we know 10 is the required length
 List<DirectoryInfo> dirsList = new List<DirectoryInfo>(dirsArray);
Run Code Online (Sandbox Code Playgroud)

以上给出了以下编译器错误:

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>'
Run Code Online (Sandbox Code Playgroud)

但我知道List<T>(IEnumerable<T>)可以接受任何IEnumerable作为论据.我知道那System.Array是IEnumerable.不仅因为它在引用中,而且因为使用[]构造函数语法的第一个示例工作正常.

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

Sel*_*enç 5

Array类本身不是IEnumerable<T>.你需要投射结果Array.CreateInstance

var dirsArray = (DirectoryInfo[]) Array.CreateInstance(typeof(DirectoryInfo), 10);
Run Code Online (Sandbox Code Playgroud)

Array是所有数组类型的基类,并在运行时IEnumerable<T>提供实现.因此IEnumerable<T>在编译时无法使用数组.MSDN

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