I have just noticed that a multidimensional array in C# does not implement IEnumerable<T>, while it does implement IEnumerable. For single-dimensional arrays, both IEnumerable<T> and IEnumerable are implemented.
Why this difference? If a multi-dimensional array is IEnumerable, surely it should also implement the generic version? I noticed this because I tried to use an extension method on a multidimensional array, which fails unless you use Cast<T> or similar; so I can definitely see the an argument for making multidimensional arrays implement IEnumerable<T>.
To clarify my question in code, I would expect the following code to print true four times, while it actually prints 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);
The CLR has two different kinds of arrays: vectors which are guaranteed to be one-dimensional with a lower bound of 0, and more general arrays which can have non-zero bounds and a rank other than 0.
From section 8.9.1 of the CLI spec:
I have to say it seems pretty weird to me. Given that it already implements
IEnumerableI don’t see why it shouldn’t implementIEnumerable<T>. It wouldn’t make as much sense to implementIList<T>, but the simple generic interface would be fine.If you want this, you could either call
Cast<T>(if you’re using .NET 3.5) or write your own method to iterate through the array. To avoid casting you’d have to write your own method which found the lower/upper bounds of each dimension, and fetched things that way. Not terribly pleasant.