我刚刚注意到,C#中的多维数组不实现IEnumerable<T>,而实现IEnumerable.对于一维数组,实现了IEnumerable<T>IEnumerable.

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

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

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有两种不同类型的数组:vectors保证是一维的,下界为0,以及更一般的数组,可以有非零界和非0的秩.

根据CLI规范第8.9.1节:

此外,创建的向量

我得说我觉得很奇怪.考虑到它已经实现了IEnumerable,我不明白为什么它不应该实现IEnumerable<T>.实现IList<T>没有多大意义,但简单的通用接口就可以了.

如果需要,可以调用Cast<T>(如果使用的是.NET3.5),或者编写自己的方法来迭代array.为了避免强制转换,您必须编写自己的方法,找到每个维度的上下限,并以这种方式获取内容.不太愉快.

.net相关问答推荐

如何通过在后台预加载流项来优化流迭代的性能?

C# 中的批量更新

StreamWriter.Flush() 和 StreamWriter.Close() 有什么区别?

我应该创建一个 DateRange 对象吗?

在 ASP.NET MVC 中我可以在哪里放置自定义类?

Unity 2.0:如何使用 Resolve 和 ResolverOverride?

如何明智地使用 StringBuilder?

如何在 WPF 应用程序中使用 App.config 文件?

获取当前方法的名称

如何让 .NET 的 Path.Combine 将正斜杠转换为反斜杠?

Java 和 .NET 技术/框架的类似物

ASP.NET Core 等效于 ASP.NET MVC 5 的 HttpException

如何比较 C# 中的(目录)路径?

string.Empty vs null.你用哪一个?

找不到库 hostpolicy.dll

是 C# 中的 bool 读/写原子

SqlCommand.CommandTimeout 和 SqlConnection.ConnectionTimeout 有什么区别?

浮动与双重性能

如何在 ASP.NET MVC 中重定向到动态登录 URL

如何使用 AutoMapper .ForMember?