C# 与C中的[1][1][1][1]…[1]类似的最大数组维数#

C# 与C中的[1][1][1][1]…[1]类似的最大数组维数#,c#,.net,arrays,C#,.net,Arrays,我只是看到了这个问题,事实上我也试图回答它。但在回答时,我想如果是C#,答案会是什么?我正在寻找一些MSDN文件或任何相关的来源,如在 C#likea[1][1][1][1]…[1]中的数组允许的最大维数是多少。我试图继续搜索,但没能找到 我得到的最好结果是“一个数组理论上最多只能有2147483647个元素,因为它使用int作为索引。” 另外,我知道一个数组可以容纳的最大大小是 System.Int32.MaxValue 请务必告诉我,如果这是重复的,我将删除我的问题。限制为32。我找到了答案

我只是看到了这个问题,事实上我也试图回答它。但在回答时,我想如果是C#,答案会是什么?我正在寻找一些MSDN文件或任何相关的来源,如在

C#like
a[1][1][1][1]…[1]
中的数组允许的最大维数是多少。我试图继续搜索,但没能找到

我得到的最好结果是“一个数组理论上最多只能有2147483647个元素,因为它使用int作为索引。”

另外,我知道一个数组可以容纳的最大大小是

System.Int32.MaxValue


请务必告诉我,如果这是重复的,我将删除我的问题。

限制为32。我找到了答案,并(使用谷歌)用代码进行了检查:

var b = Array.CreateInstance(typeof (int), new int[32]);
var a = Array.CreateInstance(typeof (int), new int[33]);
它适用于64位和32位目标应用程序

事实上,我不必用谷歌搜索它。直接来自:

元素是数组中的值。数组的长度是它可以包含的元素总数。数组的秩是数组中的维数。数组维数的下界是该数组维数的起始索引;多维数组的每个维度可以有不同的边界一个数组最多可以有32个维度

关于锯齿阵列 但是,我刚刚注意到,您在编辑中使用的语法(以及Peter在下面的注释中使用的语法)与C#中定义多维数组的方式不同。多维数组定义为:

int[,,,] arr = new int[0,0,0];
它们是规则整数的数组,恰好有多个维度。语法:

int[][][] = new int[0][][];
定义了在C#中称为a的东西。交错数组只是规则的一维数组,碰巧有其他数组作为元素。正如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且每个数组包含2个元素的(最终)Int32交错数组将占用可忽略不计的内存量(即其自身),但所有组合的数组将占用指数级的内存量

*加一点糖。一种语法上更正确的锯齿状数组编码方法是:
int[]arr=newint[]0]因为
int[]
是元素类型

它是实现定义的
数组可以具有的维度数似乎是由实现定义的。该数字在CLI规范中的任何地方都没有出现,下面由Peter提供的数字在Ideone的mono-2.8上运行良好,其中的限制似乎是255。

这里的另一个问题是,您询问的是数组中元素的限制,您引用的问题询问数组可以使用的最大维度数have@BobVale:-是的,我在问同样的问题。@Steve:-我不认为这与你链接的问题相似。我知道这个限制。我问的是维度?作为旁注,你为什么想要这个问题的答案?你想做些具体的事情吗?您几乎总是希望避免使用多维数组。您还可以设计一个简单的数据结构,不受尺寸限制。@GregRos:-是的,我完全同意,我知道这一点。正如我在问题中提到的,我只是在Java中看到了这个问题,所以出于好奇,我在C#中问了这个问题:)我的错,直到备注部分我才去!:(如果这是真的,有人能解释一下为什么我可以在这里创建一个50维的数组吗:你关于锯齿形数组的说法是正确的。事实证明,我甚至可以在ideone.com上创建32维以上的多维数组,例如:ideone在Mono上运行,Mono在创建数组时,维度数的上限是255多维数组。似乎最大维度数是特定于实现的,我找不到语言规范中定义的最大维度数。+1,因为
[[]]…
的恐怖,并且实际运行它直到崩溃。@PetervanderHeijden这很有趣。我也找不到CLI规范中的最大维度数(不确定这是否是您所指的答案)。我将编辑我的答案以反映这些信息。
System.Int32[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]...