24

次のいずれかのエラーが発生します。

  • 「インデックスが範囲外でした。負ではなく、コレクションのサイズ未満でなければなりません」
  • 「挿入インデックスが範囲外でした。負ではなく、サイズ以下である必要があります。」
  • "インデックスが配列の範囲外だった。"

それはどういう意味ですか、どうすれば修正できますか?

関連項目
IndexOutOfRangeException
ArgumentOutOfRangeException

4

1 に答える 1

42

なぜこのエラーが発生するのですか?

コレクションの境界を超える数値インデックスを使用して、コレクション内の要素にアクセスしようとしたためです。

通常、コレクションの最初の要素は index に配置されます0。最後の要素は indexn-1にあり、nSizeコレクションの です (含まれる要素の数)。負の数をインデックスとして使用しようとした場合、または より大きい数値を使用しようとするとSize-1、エラーが発生します。

インデックス配列の仕組み

次のように配列を宣言すると、次のようになります。

var array = new int[6]

配列の最初と最後の要素は

var firstElement = array[0];
var lastElement = array[5];

だからあなたが書くとき:

var element = array[5];

配列の 5 番目の要素ではなく、6 番目の要素を取得しています。

通常、次のように配列をループします。

for (int index = 0; index < array.Length; index++)
{
    Console.WriteLine(array[index]);
}

これは、ループが 0 から開始し、が より小さくないLength-1ため で終了するため、機能します。indexLength

ただし、これは例外をスローします。

for (int index = 0; index <= array.Length; index++)
{
    Console.WriteLine(array[index]);
}

そこに気づきまし<=たか? これは、ループが有効なインデックスであるindexと考えているため、最後のループ反復で範囲外になりますが、そうではありません。Length

他のコレクションの仕組み

リストは同じように機能しますが、通常はCountの代わりに を使用しますLength。それらは依然としてゼロから始まり、 で終わりCount - 1ます。

for (int index = 0; i < list.Count; index++)
{
    Console.WriteLine(list[index]);
} 

ただし、 を使用してリストを反復処理することもできます。これにより、foreach完全にインデックスを作成するという問題全体を回避できます。

foreach (var element in list)
{
    Console.WriteLine(element.ToString());
}

コレクションにまだ追加されていない要素にインデックスを付けることはできません。

var list = new List<string>();
list.Add("Zero");
list.Add("One");
list.Add("Two");
Console.WriteLine(list[3]);  // Throws exception.
于 2014-07-17T20:13:11.510 に答える