6

考虑以下:

long size = int.MaxValue;
long[] huge = new long[size];     // throws OutOfMemoryException
long[] huge = new long[size + 1]; // throws OverflowException

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

(如果这很重要,我使用的是 64 位计算机)。

编辑:我还可以定义和使用一个可以毫无问题地接受 a 的索引器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
4

2 回答 2

8

C# 数组由System.Int32. 由于size + 1is beyond Int32.MaxValue,你会得到一个整数溢出。

Array.CreateInstance如果您真的想使用 along作为索引,请改用需要很长时间的重载。

于 2012-06-08T09:47:54.557 回答
2

因此,根据我收集到的信息,这里发生了以下情况:

  • 索引器通常可以使用任何类型的参数。
  • 内置数组索引器可以接受任何整数类型...
  • 但是内置数组索引器的底层实现需要一个值,<= Int32.MaxValue并且对于超出的值将引发溢出异常Int32.MaxValue

虽然后一点感觉像是某种奇怪的矛盾(接受大于 的类型Int32,但如果您碰巧实际使用了这些额外位中的任何一个,则会引发异常),但这显然是其中一些是一半的事实的副作用- 为将来允许包含多个Int32.MaxValue元素的数组实现。

于 2012-06-20T02:01:49.280 回答