为什么“UInt64 [] arr = new UInt64 [UInt64.MaxValue];”扔异常?

时间:2010-03-19 13:18:39

标签: c#

为什么以下代码抛出异常“算术运算导致溢出。”

UInt64[] arr=new UInt64[UInt64.MaxValue];

4 个答案:

答案 0 :(得分:7)

我猜是因为要求分配完全8 * UInt64.MaxValue个字节,这个乘法显然会溢出64位寄存器。

答案 1 :(得分:7)

因为索引器只接受Int32值。你可以做到

UInt64[] arr=new UInt64[Int32.MaxValue];

但这就是限制。

编辑:从技术上讲,你可以使用理论上高于Int32.MaxValue的值结构索引数组(因为你可以使用long或uint索引数组),但是,当你运行时会遇到运行时错误该值超过Int32.MaxValue。

答案 2 :(得分:2)

由于

a)所有对象在.NET中限制为2GB   b)你没有64个PetaBytes的内存花费

答案 3 :(得分:0)

根据Microsoft的文档,对于.NET 4.5框架,这些限制适用:

  • 数组中的最大元素数是UInt32.MaxValue。
  • 对于字节数组和单字节结构数组,任何单个维度的最大索引为2,147,483,591(0x7FFFFFC7),对于其他类型,最大索引为2,146,435,071(0X7FEFFFFF)。
  • 字符串和其他非数组对象的最大大小不变