18

40 億バイトの配列を割り当てようとしたかったのですが、これが私の C# コードです。

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

このコードは、System.OverflowExceptionを含む行で失敗しますnewLengthさて、 returnsが判明したintため、配列の長さもint保存できる長さに制限されています。

では、なぜコンパイル時エラーが発生longせず、割り当て時に配列要素の数として使用できるのでしょうか?

4

5 に答える 5

21

仕様では、セクション 7.6.10.4 にそう記載されているため:

式リスト内の各式は、 、 、 、または 型であるか、これらの型の 1 つ以上に暗黙的に変換可能である必要intuintありlongますulong

これにより、2 GiB を超える配列を簡単に作成できる可能性が高くなりますが、まだサポートされていません(ただし、CLR がそのような変更を行うと、言語は変更されません)。Mono はこれをサポートしていますが.NET 4.5 ではより大きな配列も許可されるようです。

intちなみに、配列の長さについてはLongLength、 を返すもありlongます。これは .NET 1.1 にあり、おそらく将来を見据えた変更です。

于 2012-06-08T08:35:38.613 に答える
10

配列の長さとして long が許可されるのはなぜですか?

答えは: .net の long は Int64 を意味します

また、配列のインデックスは、仕様に従って Int64 にすることができます。

2 番目の質問: なぜオーバーフロー例外が表示されるのですか?

1 つのオブジェクトに 2GB を超えるメモリを割り当てることはできないためです。

于 2012-06-08T08:45:40.540 に答える
7

これは CLR の制限です。配列を含め、1 つのオブジェクトが 2GB を超えることはできません。

大きな配列 C# OutOfMemoryException

これは、32 ビットまたは 64 ビット OS に関係ありません。とはいえ、1 つのオブジェクトだけでなく、合計でそれ以上の量を使用することを妨げるものではありません。

(または他の初期化値)を範囲内に保つと機能するため、これは実行時エラーです。long

すべての整数型sbyteで配列を初期化charできshortます。署名されていないバリアントも機能します。intlong

于 2012-06-08T08:35:46.160 に答える
4

.Net 4.5-4.6 には、配列に大きなサイズを許可するためのソリューションがあります。

<runtime>
    <gcAllowVeryLargeObjects enabled="true" />
</runtime>

ドキュメントを参照してください

于 2016-01-14T00:36:48.037 に答える
3

long整数型であるため、配列の定義に使用できます。例外は、特にlong.

例、これはうまくいきます:

long size = 20;
byte[] array = new byte[size];
于 2012-06-08T08:37:48.257 に答える