所有数组在C#中实现的接口是什么?

作为一名新的.NET 3.5程序员,我开始学习LINQ,并发现了一些我以前没有注意到的基本东西:

本书声明每一个数组都实现了IEnumerable<T> (显然,否则我们不能使用LINQ到数组上的对象)。 当我看到这个时,我想我自己从来没有真正想过,我问自己还有什么数组实现 – 所以我使用对象浏览器检查了System.Array (因为它是CLR中每个数组的基类)而且,令我吃惊的是,它没有实现IEnumerable<T>

所以我的问题是:定义在哪里? 我的意思是,我怎么能确切地告诉每个数组实现哪些接口?

从文档 (重点是我的):

Array类实现了System.Collections.Generic.IList<T>System.Collections.Generic.ICollection<T>System.Collections.Generic.IEnumerable<T>通用接口。 这些实现在运行时提供给数组,因此对于文档构build工具是不可见的。

编辑:因为Jb Evain在他的评论中指出,只有向量(一维数组)实现通用接口。 至于为什么multidimensional array没有实现通用接口,我不太确定,因为他们确实实现了非通用接口(参见下面的类声明)。

System.Array类(即每个数组)也实现了这些非通用接口:

 public abstract class Array : ICloneable, IList, ICollection, IEnumerable, IStructuralComparable, IStructuralEquatable 

你可以使用一个小的代码片断,凭经验find你的问题的答案:

 foreach (var type in (new int[0]).GetType().GetInterfaces()) Console.WriteLine(type); 

运行上面的代码将导致下面的输出(在.NET 4.0上):

 System.ICloneable System.Collections.IList System.Collections.ICollection System.Collections.IEnumerable System.Collections.IStructuralComparable System.Collections.IStructuralEquatable System.Collections.Generic.IList`1[System.Int32] System.Collections.Generic.ICollection`1[System.Int32] System.Collections.Generic.IEnumerable`1[System.Int32] 

`1表示<T>

.NET 4.5开始数组也实现了接口System.Collections.Generic.IReadOnlyList<T>System.Collections.Generic.IReadOnlyCollection<T>

因此,在使用.NET 4.5时,由数组实现的接口的完整列表变为(使用Hosam Aly的答案中提供的方法获得):

 System.Collections.IList System.Collections.ICollection System.Collections.IEnumerable System.Collections.IStructuralComparable System.Collections.IStructuralEquatable System.Collections.Generic.IList`1[System.Int32] System.Collections.Generic.ICollection`1[System.Int32] System.Collections.Generic.IEnumerable`1[System.Int32] System.Collections.Generic.IReadOnlyList`1[System.Int32] System.Collections.Generic.IReadOnlyCollection`1[System.Int32] 

奇怪的是,似乎忘记了更新MSDN上的文档来提及这两个接口。