为什么在C#中允许“long”作为数组长度?

我想尝试分配一个40亿字节的数组,这是我的C#代码:

long size = 4 * 1000; size *= 1000; size *= 1000; byte[] array = new byte[size]; 

此代码在包含new的行上的System.OverflowException失败。 好的,结果是Length返回int ,所以数组长度也限制为int可以存储的内容。

那么为什么没有编译时错误,并且允许long作为分配时数组元素的数量?

因为规范在第7.6.10.4节中说明了这一点:

表达式列表中的每个表达式必须是intuintlongulong ,或者可以隐式转换为这些类型中的一个或多个。

这很可能很容易创建大于2 GiB的数组,即使它们尚不支持(但一旦CLR做出这样的改变就没有语言改变)。 Mono确实支持这一点,但 .NET 4.5显然也允许更大的arrays 。

关于数组长度顺便说一下int :还有LongLength ,返回long 。 这是在.NET 1.1中,可能是一个面向未来的变化。

为什么长数被允许作为数组长度?

答案是:long in .net表示Int64

根据规范,数组索引可以是Int64。

第二个问题:为什么要显示overflowexception?

因为任何单个对象都不能分配超过2GB的内存。

它是CLR的限制,没有单个对象可以超过2GB,包括数组:

大数组C#OutOfMemoryException

这与32位或64位操作系统无关。 也就是说,它不会阻止你总共使用超过这个数量,而不是一个对象。

这是一个运行时错误,因为如果将long (或其他初始化值)保持在范围内,它将起作用。

您可以使用所有整数类型初始化数组: sbytecharshortintlong – 所有编译; 无符号变体也可以工作。

.Net 4.5-4.6中有一个解决方案,允许大型数组。

    

https://msdn.microsoft.com/en-us/library/hh285054(v=vs.110).aspx

long是一个整数类型,因此可用于定义数组; 例外是构建太大的数组,而不是特别使用long

例如,这很好用:

 long size = 20; byte[] array = new byte[size];