私は次のエラーのいずれかを受けています:
- 「索引が範囲外です。負でなく、コレクションのサイズより小さくなければなりません」
- msgstr "挿入インデックスが範囲外です。負でなく、サイズ以下でなければなりません。"
- "インデックスが配列の範囲外だった。"
それはどういう意味ですか、どうすれば修正できますか?
関連項目
IndexOutOfRangeException
ArgumentOutOfRangeException
回答:
回答№1の33このエラーはなぜ発生しますか?
コレクションの要素の境界を超える数値インデックスを使用して、コレクションの要素にアクセスしようとしたためです。
コレクション内の最初の要素は、一般にインデックスに配置されます 0
。最後の要素はインデックスにあります n-1
、どこで n
それは Size
コレクションの要素の数(含まれる要素の数)負の数をインデックスとして使用するか、 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]);
}
これは、ループがゼロから始まり、 Length-1
なぜなら index
もはや Length
.
ただし、これにより例外がスローされます。
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.