C#中所有数组都实现了哪些接口?

22 浏览
0 Comments

C#中所有数组都实现了哪些接口?

作为一个新的.NET 3.5程序员,我开始学习LINQ,并发现了一个相当基础的东西,之前我从未注意到:

书中声称每个数组都实现了>接口(显然,否则我们就无法在数组上使用LINQ to objects...)。当我看到这个时,我想到我从未真正考虑过这个问题,于是我问自己,所有数组还实现了什么其他接口 - 所以我使用对象浏览器检查了System.Array(因为它是CLR中每个数组的基类),令我惊讶的是,它并没有实现>接口。

所以我的问题是:这个定义在哪里?我的意思是,我如何确切地知道每个数组实现了哪些接口?

0
0 Comments

在C#中,数组实现了一系列接口,包括System.Collections.Generic.IReadOnlyList和System.Collections.Generic.IReadOnlyCollection。然而,奇怪的是,官方文档上并没有提到这两个接口。

问题的原因可能是官方文档遗忘更新,没有包含这两个接口的信息。这导致开发者在使用数组时可能不知道这两个接口的存在。

解决方法是查看其他来源的文档。在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、System.Collections.Generic.ICollection和System.Collections.Generic.IEnumerable接口。这些实现是在运行时为数组提供的,因此,在Array类的声明语法中不会出现这些泛型接口。”

0
0 Comments

所有的数组在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。

0
0 Comments

在C#中,所有的数组都实现了哪些接口?

根据文档(重点标注为我的):

[...] Array类实现了System.Collections.Generic.IList、System.Collections.Generic.ICollection和System.Collections.Generic.IEnumerable泛型接口。这些实现是在运行时为数组提供的,因此对于文档生成工具是不可见的。

编辑:正如Jb Evain在他的评论中指出的,只有向量(一维数组)实现了泛型接口。至于为什么多维数组不实现泛型接口,我不太确定,因为它们确实实现了非泛型的对应接口(请参见下面的类声明)。

System.Array类(即每个数组)还实现了这些非泛型接口:

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

我可以说:继承了这个非泛型类,从而实现了这些非泛型接口。

我不喜欢问一些傻问题,所以我真的尽量先在MSDN上找到答案。这次我错过了...对给你们带来的麻烦表示抱歉,感谢你们的帮助。

我没有给你们点踩的,但只有向量(一维数组)类型实现了泛型接口。多维数组类型不实现它们。

Evain: 说得好!值得注意的是,交错数组也实现了泛型接口。

Aly: 交错数组只不过是包含其他向量的向量而已。所以这里并没有什么意外。

0