我刚刚注意到C#中的多维数组没有实现IEnumerable
,而它确实实现了IEnumerable
.对于一维数组,这两个IEnumerable
和IEnumerable
来实现.
为何如此区别?如果是一个多维数组IEnumerable
,它肯定也应该实现通用版本?我注意到了这一点,因为我试图在多维数组上使用扩展方法,除非你使用Cast
或类似,否则会失败; 所以我绝对可以看到实现多维数组的论据IEnumerable
.
为了澄清我的问题在代码中,我希望下面的代码打印true
的四倍,而它实际打印true
,false
,true
,true
:
int[] singleDimensionArray = new int[10]; int[,] multiDimensional = new int[10, 10]; Debug.WriteLine(singleDimensionArray is IEnumerable); Debug.WriteLine(multiDimensional is IEnumerable ); Debug.WriteLine(singleDimensionArray is IEnumerable); Debug.WriteLine(multiDimensional is IEnumerable);
Jon Skeet.. 47
CLR有两种不同的数组:保证为一维且下限为0的向量,以及可以具有非零边界和非0的等级的更一般的数组.
从CLI规范的第8.9.1节:
此外,元素类型为T的创建向量实现接口
System.Collections.Generic.IList
(第8.7节),其中U:= T.
我不得不说这对我来说似乎很奇怪.鉴于它已经实现,IEnumerable
我不明白为什么它不应该实现IEnumerable
.它实现起来并没有多大意义IList
,但简单的通用接口会很好.
如果你想要这个,你可以调用Cast
(如果你使用的是.NET 3.5)或编写自己的方法来迭代数组.为了避免强制转换,你必须编写自己的方法,找到每个维度的下限/上限,并以这种方式获取东西.不是非常愉快.
CLR有两种不同的数组:保证为一维且下限为0的向量,以及可以具有非零边界和非0的等级的更一般的数组.
从CLI规范的第8.9.1节:
此外,元素类型为T的创建向量实现接口
System.Collections.Generic.IList
(第8.7节),其中U:= T.
我不得不说这对我来说似乎很奇怪.鉴于它已经实现,IEnumerable
我不明白为什么它不应该实现IEnumerable
.它实现起来并没有多大意义IList
,但简单的通用接口会很好.
如果你想要这个,你可以调用Cast
(如果你使用的是.NET 3.5)或编写自己的方法来迭代数组.为了避免强制转换,你必须编写自己的方法,找到每个维度的下限/上限,并以这种方式获取东西.不是非常愉快.
有一种解决方法:您可以将任何多维数组转换为IEnumerable
public static class ArrayExtensions { public static IEnumerableToEnumerable (this Array target) { foreach (var item in target) yield return (T)item; } }