我是编程和.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
类本身不是一个IEnumerable<T>
。您将需要强制转换Array.CreateInstance
var dirsArray = (DirectoryInfo[]) Array.CreateInstance(typeof(DirectoryInfo), 10);
Array
是所有数组类型的基类,并且在运行时IEnumerable<T>
提供的实现,因此无法IEnumerable<T>
在编译时使用Array 。MSDN
从.NET Framework 2.0开始,Array类实现
System.Collections.Generic.IList<T>
,System.Collections.Generic.ICollection<T>
以及System.Collections.Generic.IEnumerable<T>
通用接口。这些实现是在运行时提供给数组的,因此,通用接口不会出现在Array类的声明语法中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句