C# 列表<;T>;构造函数(IEnumerable<;T>;)不';不接受从array.CreateInstance(类型,Int32)创建的数组
我是编程和.net的新手,我很难理解为什么使用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[]
列表(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>());