C# · 12月 26, 2021

c# – 分配大型数组; OutOfMemoryException VS OverflowException

考虑以下: long size = int.MaxValue;long[] huge = new long[size]; // throws OutOfMemoryExceptionlong[] huge = new long[size + 1]; // throws OverflowException

我知道单个对象的大小有2GB的限制,这解释了第一个异常,但是为什么一旦元素数量超过32位,我会得到一个不同的异常?

(如果这很重要,我正在使用64位计算机).

编辑:我也可以定义和使用一个接受long而没有问题的索引器:

internal sealed class MyClass{ public object this[long x] { get { Console.WriteLine(“{0}”,x); return null; } }}…long size = int.MaxValue;MyClass asdf = new MyClass();object o = asdf[size * 50]; // outputs 107374182350解决方法 C#数组由system.int32索引.由于大小1超出Int32.MaxValue,因此会出现整数溢出.

如果你真的想使用long作为索引,那么使用需要很长的Array.CreateInstance的重载.