我刚刚注意到,C#中的多维数组没有实现IEnumerable
,而它实现了IEnumerable
。对于单维数组,同时实现IEnumerable
和IEnumerable
。
为什么会有这种差别?如果多维数组是IEnumerable
,那么它是否也应该实现泛型版本?我注意到这一点,是因为我试图在多维数组上使用扩展方法,除非您使用cast
或类似的方法,否则会失败;所以我可以肯定地看到使多维数组实现IEnumerable
的一个参数。
为了在代码中澄清我的问题,我希望下面的代码打印四次true
,而它实际打印的是true
、false
、true
、true
、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节:
此外,创建的元素类型为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;
}
}