6

次のことを考慮してください。

long size = int.MaxValue;
long[] huge = new long[size];     // throws OutOfMemoryException
long[] 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
4

2 に答える 2

8

C#配列は、によってインデックスが付けられSystem.Int32ます。size + 1を超えているためInt32.MaxValue、整数のオーバーフローが発生します。

本当にインデックスとしてArray.CreateInstance使用したい場合は、代わりにそのオーバーロードを使用してください。long

于 2012-06-08T09:47:54.557 に答える
2

だから私が集めたものから、次のようなことがここで起こっています:

  • インデクサーは一般に、任意のタイプのパラメーターを使用できます。
  • 組み込みの配列インデクサーは、任意の整数型を受け入れることができます...
  • ただし、組み込み配列インデクサーの基本的な実装には、<= Int32.MaxValueを超える値に対してオーバーフロー例外をスローする値が必要Int32.MaxValueです。

後者の点はある種の奇妙な矛盾のように感じますが(よ​​り大きな型を受け入れますInt32が、実際にそれらの余分なビットのいずれかを使用した場合は例外をスローします)、これは明らかに、これの一部が半分であるという事実の副作用です-より多くのInt32.MaxValue要素を持つことが許可される配列の将来の実装のために実装されます。

于 2012-06-20T02:01:49.280 に答える