限制为32。我用代码检查了它:
var b = Array.CreateInstance(typeof (int), new int[32]);
var a = Array.CreateInstance(typeof (int), new int[33]);
这适用于针对64位和32位的应用程序。
实际上,我不需要通过谷歌来获得答案。直接来自MSDN:
元素是数组中的值。 数组的长度是它可以包含的元素总数。 数组的等级是数组中的维数数量。 数组维度的下限是该数组的该维度的起始索引;多维数组可以具有每个维度的不同边界。 数组最多可以有32个维度。
然而,我刚刚注意到你在编辑中使用了语法(并且Peter在下面的评论中也使用了相同的语法),这不是C#中定义多维数组的方式。多维数组的定义方式如下:
int[,,,] arr = new int[0,0,0];
它们是由常规整数组成的数组,恰好具有多个维度。语法:
int[][][] = new int[0][][];
定义了在C#中被称为交错数组的东西。交错数组只是常规的单维数组,其元素恰好是其他数组。正如MSDN文章所指出的那样,你可以有交错数组的多维数组,或者反过来。
然而,它们被以不同的方式处理。交错数组只是(实际上)常规对象的数组,并且因此没有像多维数组一样受到限制。交错数组的“维数”理论上没有限制,事实上CLR很高兴地让我运行了以下代码:
Array arr = new int[0];
for (int i = 0; i < Int32.MaxValue - 1; i++) {
var newArr = Array.CreateInstance(arr.GetType(), 1);
newArr.SetValue(arr, 0);
arr = newArr;
}
直到我的系统完全无响应并崩溃。没有抛出任何异常。
将循环限制为1000次迭代,您会发现结果数组的类型是:
System.Int32[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]...
此外,尽管我找不到相关的来源,但是一个锯齿状数组可以有的维数可能甚至不受单个对象内存限制的限制,因为每个数组只有对对象的引用。例如,具有嵌套因子为1000且每个数组有2个元素的(最终)Int32
锯齿状数组将占用可忽略的内存量(也就是说,它本身),但所有数组组合起来将占用指数级的内存。
* 通过一些语法糖。编码锯齿状数组的更加语法上正确的方式是:int[][] arr = new int[][0];
,因为 int[]
是元素类型。
数组可以有的维数似乎是实现定义的。该数字在 CLI 规范中似乎不存在,并且由 Peter 提供的代码在 Ideone 的 mono-2.8 上运行良好,在那里似乎限制为 255。
[][][][][][]...
的恐怖和实际运行直到崩溃的经历,点个赞。 - Tim S.