提问者:小点点

为什么C#多维数组不实现IEnumerable<T>?


我刚刚注意到,C#中的多维数组没有实现IEnumerable,而它实现了IEnumerable。对于单维数组,同时实现IEnumerableIEnumerable

为什么会有这种差别?如果多维数组是IEnumerable,那么它是否也应该实现泛型版本?我注意到这一点,是因为我试图在多维数组上使用扩展方法,除非您使用cast或类似的方法,否则会失败;所以我可以肯定地看到使多维数组实现IEnumerable的一个参数。

为了在代码中澄清我的问题,我希望下面的代码打印四次true,而它实际打印的是truefalsetruetruetruetrue:

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);

共2个答案

匿名用户

CLR有两种不同的数组:一种是保证一维的向量,下界为0,另一种是更一般的数组,它们可以有非零界和不是0的秩。

根据CLI规范第8.9.1节:

此外,创建的元素类型为T的向量实现了接口System.Collections.Generic.IList(§8.7),其中U:=T。

我不得不说这对我来说很奇怪。鉴于它已经实现了IEnumerable,我不明白为什么它不应该实现IEnumerable。实现ilist没有那么大的意义,但是使用简单的泛型接口就可以了。

如果您想这样做,您可以调用cast(如果您使用的是.NET3.5),或者编写自己的方法来迭代数组。为了避免强制转换,您必须编写自己的方法,找到每个维度的下界/上界,并以这种方式获取内容。不是很愉快。

匿名用户

有一个解决方法:您可以将任何多维数组转换为IEnumerable

public static class ArrayExtensions
{
    public static IEnumerable<T> ToEnumerable<T>(this Array target)
    {
        foreach (var item in target)
            yield return (T)item;
    }
}