【发布时间】:2014-12-02 06:36:54
【问题描述】:
我是编程和 .net 的新手,我很难理解为什么使用 List<T>(IEnumerable<T>) 构造函数接受使用 [] 创建的数组,但不接受使用 Array.CreateInstance(Type, Int32) 创建的数组。
以下是有效的:
DirectoryInfo[] dirsArray = foo.GetDirectories();
List<DirectoryInfo> dirsList = new List<DirectoryInfo>(dirsArray);
以下是没有的:
Array dirsArray = Array.CreateInstance(typeof(DirectoryInfo), 10); //assume we know 10 is the required length
List<DirectoryInfo> dirsList = new List<DirectoryInfo>(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>'
但我知道List<T>(IEnumerable<T>) 可以接受任何IEnumerable 作为参数。我知道System.Array 是IEnumerable。不仅因为这在参考文献中,还因为第一个使用 [] 构造函数语法的示例运行良好。
那么这里的问题是什么? Array.CreateInstance 是否设法创建了一个不是 IEnumerable 的数组?
【问题讨论】:
-
因为
Array.CreateInstance返回一个未类型化的Array,它没有实现IEnumerable<T>。 -
您想通过使用
Array.CreateInstance解决什么问题?我个人从来没有发现它的用途。 -
其实我想把ControlCollection转成List
,不知道怎么做。所以我添加了一个步骤,先将其转换为数组,然后再将其转换为列表。