gpt4 book ai didi

c# - 为什么 C# 多维数组不实现 IEnumerable

转载 作者:IT王子 更新时间:2023-10-29 03:43:50 24 4
gpt4 key购买 nike

我刚刚注意到 C# 中的多维数组没有实现 IEnumerable<T> , 虽然它确实实现了 IEnumerable .对于一维数组,IEnumerable<T>IEnumerable已实现。

为什么会有这种差异?如果一个多维数组是IEnumerable ,当然它也应该实现通用版本?我注意到这一点是因为我试图在多维数组上使用扩展方法,除非你使用 Cast<T> 否则它会失败。或类似的;所以我绝对可以看到使多维数组实现的论点 IEnumerable<T> .

为了用代码澄清我的问题,我希望下面的代码打印出 true四次,而它实际打印 true , false , true , true :

int[] singleDimensionArray = new int[10];
int[,] multiDimensional = new int[10, 10];

Debug.WriteLine(singleDimensionArray is IEnumerable<int>);
Debug.WriteLine(multiDimensional is IEnumerable<int>);
Debug.WriteLine(singleDimensionArray is IEnumerable);
Debug.WriteLine(multiDimensional is IEnumerable);

最佳答案

CLR 有两种不同类型的数组:向量 保证是下界为 0 的一维数组,以及更通用的数组,可以有非零界和其他等级小于 0。

来自 CLI 规范的第 8.9.1 节:

Additionally, a created vector with element type T, implements the interface System.Collections.Generic.IList<U> (§8.7), where U := T.

我不得不说这对我来说似乎很奇怪。鉴于它已经实现了 IEnumerable我不明白为什么它不应该实现 IEnumerable<T> .实现 IList<T> 意义不大, 但简单的通用接口(interface)就可以了。

如果你想要这个,你可以调用 Cast<T> (如果您使用的是 .NET 3.5)或编写您自己的方法来遍历数组。为避免转换,您必须编写自己的方法来找到每个维度的下限/上限,并以这种方式获取内容。不是很愉快。

关于c# - 为什么 C# 多维数组不实现 IEnumerable<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/275073/

24 4 0