所有数组在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上的文档来提及这两个接口。