好玩的Array类型

今天学习LinQ的时候,为了研究LinQ到底支不支持实现了IEnumerable(非泛型)接口的对象发现了有趣的现象,LinQ是不支持的,但是LinQ竟然可以对string[] 查询,据我所知,所有的数组都是派生自Array基类,那么是Array实现了IEnumerable<T>接口?通过F12查看Array的定义,发现也没有啊!那么。。。长话短说,Array是实现IEnumeable<T>的,但是这个是运行时赋予的!所以通过F12查询他的定义是看不到的。。以下代码能正确执行:


            Array arr = new string[] {"tiger", "lion", "cat"};;
            IEnumerable<string> enumableArr = arr as IEnumerable<string>;

            IEnumerable<string> query = from item in enumableArr select item;
            foreach(var str in query)
                Console.WriteLine(str);

但要注意,因为是运行时赋予的,所以以下代码不能通过编译(因为LinQ需要一个实现了IEnumerable<T>的对象:


            Array arr = new string[] {"tiger", "lion", "cat"};;

            IEnumerable<string> query = from item in arr select item;
            foreach (var str in query)
                Console.WriteLine(str);


这个是MSDN的解释:

Array 类是支持数组的语言实现的基类。但是,只有系统和编译器能够从 Array 类显式派生。用户应当使用由语言提供的数组构造。

一个元素就是 Array 中的一个值。Array 的长度是它可包含的元素总数。Array 的秩是 Array 中的维数。Array 中维度的下限是 Array 中该维度的起始索引,多维 Array 的各个维度可以有不同的界限。

Note重要事项:

在 .NET Framework 2.0 版中,Array 类实现 System.Collections.Generic.IListSystem.Collections.Generic.ICollection 和 System.Collections.Generic.IEnumerable 泛型接口。由于实现是在运行时提供给数组的,因而对于文档生成工具不可见。因此,泛型接口不会出现在 Array 类的声明语法中,也不会有关于只能通过将数组强制转换为泛型接口类型(显式接口实现)才可访问的接口成员的参考主题。将某一数组强制转换为这三种接口之一时需要注意的关键一点是,添加、插入或移除元素的成员会引发 NotSupportedException

http://msdn.microsoft.com/zh-cn/library/system.array(VS.80).aspx



原文地址:https://www.cnblogs.com/puncha/p/3876971.html