C#中所有数组都实现了哪些接口?
在C#中,数组实现了一系列接口,包括System.Collections.Generic.IReadOnlyList
问题的原因可能是官方文档遗忘更新,没有包含这两个接口的信息。这导致开发者在使用数组时可能不知道这两个接口的存在。
解决方法是查看其他来源的文档。在Stack Overflow上的一篇回答中,提供了一种方法来获取数组实现的所有接口。根据这个方法,我们得到了数组实现的完整接口列表。在.NET 4.5及以上版本中,数组实现的接口包括:
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]
虽然官方文档没有提到这些接口,但是在文档的某个角落里确实有这些信息。在官方文档的描述中,可以找到以下内容:“从.NET Framework 2.0开始,Array类实现了System.Collections.Generic.IList
所有的数组在C#中都实现了以下接口:
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]
在.NET 4.5(.NET Standard 1.0)之后,又引入了两个额外的接口:
System.Collections.Generic.IReadOnlyList`1[System.Int32]
System.Collections.Generic.IReadOnlyCollection`1[System.Int32]
以上的内容可以通过以下代码片段来验证:
foreach (var type in (new int[0]).GetType().GetInterfaces())
Console.WriteLine(type);
输出结果即为上述的接口列表。
这个问题的出现是因为有人想要知道在C#中,所有的数组实现了哪些接口。通过运行这段代码,我们可以得到答案。
解决方法是使用一个foreach循环遍历一个空的int类型数组的接口,并将结果打印出来。代码中使用了GetType()方法来获取数组的运行时类型,再调用GetInterfaces()方法获取其实现的接口列表,并用Console.WriteLine()方法将结果打印出来。
需要注意的是,在.NET 4.5(.NET Standard 1.0)及之后的版本中,又额外引入了两个接口:IReadOnlyList和IReadOnlyCollection。
在C#中,所有的数组都实现了哪些接口?
根据文档(重点标注为我的):
[...] Array类实现了System.Collections.Generic.IList
编辑:正如Jb Evain在他的评论中指出的,只有向量(一维数组)实现了泛型接口。至于为什么多维数组不实现泛型接口,我不太确定,因为它们确实实现了非泛型的对应接口(请参见下面的类声明)。
System.Array类(即每个数组)还实现了这些非泛型接口:
public abstract class Array : ICloneable, IList, ICollection, IEnumerable, IStructuralComparable, IStructuralEquatable
我可以说:继承了这个非泛型类,从而实现了这些非泛型接口。
我不喜欢问一些傻问题,所以我真的尽量先在MSDN上找到答案。这次我错过了...对给你们带来的麻烦表示抱歉,感谢你们的帮助。
我没有给你们点踩的,但只有向量(一维数组)类型实现了泛型接口。多维数组类型不实现它们。
Evain: 说得好!值得注意的是,交错数组也实现了泛型接口。
Aly: 交错数组只不过是包含其他向量的向量而已。所以这里并没有什么意外。