数组中元素的确切最大限制是多少

这是一个纯粹的理论问题,所以请不要在你的答案中警告我。

如果我没有弄错,并且因为.NET中的每个数组都由Int32索引,这意味着索引的范围从0Int32.MaxValue

假设不涉及内存/ GC约束 ,.NET中的数组最多可包含2147483648 (而不是2147483647 )个元素。 对?

那么, 理论上这是真的。 实际上,理论上可以支持更大的数组 – 请参阅此Array.CreateInstance签名,该签名需要long值的long值。 您将无法使用C#索引器索引此类数组,但您可以使用GetValue(long)

但是, 实际上 ,我不认为任何实现支持如此庞大的数组。 CLR的每个对象限制略低于2GB,因此即使是字节数组也不能实际具有2147483648个元素。 一些实验表明,在我的盒子上,你可以创建的最大数组是new byte[2147483591] 。 (这是在64位.NET CLR上; Mono的版本已经安装了choke。)

编辑:只是查看CLI规范,它指定数组具有Int32的下限和上限。 这意味着Int32.MaxValue被禁止,即使它们可以用Array.CreateInstance调用表示。 但是,它意味着允许一个带有边界Int32.MinValue...Int.MaxValue的数组是Int32.MinValue...Int.MaxValue ,即总共4294967296个元素。

编辑:再看一下,ECMA 335 partition III section 4.20( newarr )指定初始化带newarr向量类型必须采用native intint32值。 所以看起来虽然CLI术语中通常更宽松的“数组”类型必须具有int32边界,但“向量”类型却没有。