※ この記事にはアフィリエイトリンクが含まれます
C#で配列を扱っていて「範囲外のエラー」が出て困っていませんか?
・配列の添字が0から始まることを忘れてしまう
・forループの終了条件を1つ多くしてしまう
・多次元配列やジャグ配列で混乱してしまう
結論から言うと、ほとんどの「C# 配列 範囲外 エラー」は添字の扱いか長さの確認不足が原因です。
・配列長をLengthで確認する
・foreachやListなど安全な代替を使う
・デバッガや例外メッセージで発生箇所を特定する
この記事を読むと、IndexOutOfRangeExceptionの典型的な原因と具体的な対処法を学べますので、ぜひ最後までご覧ください。
配列の範囲外エラーとは何か
まず、発生するエラーの正体を押さえましょう。C#では添字が無効なときにIndexOutOfRangeExceptionが投げられます。たとえば、長さ3の配列に対してarr[3]にアクセスするとエラーになります。これは添字が0から2までだからです。
なぜ起きるのか
主な原因は次の通りです。添字の範囲を超えるアクセス、オフバイワン(1つずれている)ミス、ループ条件の誤り、配列の初期化忘れなどです。
また、多次元配列や配列の配列(ジャグ配列)では各次元や各要素の長さが異なるため、想定外の範囲外が発生しやすくなります。
よくある具体例と原因の説明
ここからは具体的なコード例で、どのようにして範囲外アクセスが起きるかを説明します。初心者が陥りやすいパターンを順に見ていきましょう。
例1: 基本的なオフバイワンエラー
次のコードはよくあるミスの代表例です。配列長が3なのにfor文でi <= arr.Lengthとしてしまう場合です。
int[] arr = new int[3];
for (int i = 0; i <= arr.Length; i++)
{
arr[i] = i;
}この場合、最後のループでiは3になり、arr[3]にアクセスしようとして例外が起きます。チェックは必ず i < arr.Length にしてください。
例2: 多次元配列の誤解
多次元配列とジャグ配列は挙動が違います。次のコードは誤解からエラーが出る例です。
int[,] matrix = new int[2,3];
int x = matrix[1,3]; // ここでエラー
2行3列の配列では列の最大インデックスは2です。二次元配列の添え字は0から始まる点に注意してください。
例3: ジャグ配列で各行の長さが異なる場合
ジャグ配列(配列の配列)では各要素が独自の長さを持ちます。ループで共通の長さを使うと範囲外になります。
int[][] jagged = new int[2][];
jagged[0] = new int[2];
jagged[1] = new int[4];
for (int i = 0; i < jagged.Length; i++)
{
for (int j = 0; j < jagged[0].Length; j++)
{
jagged[i][j] = i + j; // i==1, j>=2 のときエラー
}
}内側のループで jagged[0].Length を使っていますが、行ごとに長さが違うため安全ではありません。必ず jagged[i].Length を使いましょう。
効果的な対策と使い分け
では、具体的にどう直せばよいかを説明します。初心者でも実践しやすい手順を示します。
配列長を常にチェックする
ループやアクセス前に Length プロパティで範囲を確認します。条件は i < arr.Length を基本にします。
また、負の添字を使わないように注意してください。添字が負になるケースは少ないですが、計算ミスで起きます。
foreachを使って安全にループする
要素を読み書きするだけならforeachが安全です。添字操作を避けられるのでオフバイワンを防げます。
int[] arr = new int[] {1,2,3};
foreach (int v in arr)
{
Console.WriteLine(v);
}ただしforeachでは配列の要素自体を直接変更することはできません。要素を書き換える必要がある場合はforを使います。
List<T>やコレクションを使う
要素数が変動する場合は配列よりListを使うと安全です。ListはAddやRemoveでサイズ管理を内部で行います。
var list = new System.Collections.Generic.List<int>();
list.Add(1);
int v = list[0];Listでも添字アクセスは可能なので、インデックスを使う際はLengthではなく Count をチェックしてください。
デバッガと例外メッセージを活用する
Visual Studioのデバッガを使えば、例外発生時のスタックトレースや変数の状態を確認できます。どの配列、どの添字が問題か特定しやすくなります。
IndexOutOfRangeExceptionのメッセージとスタックトレースを確認して、該当行の前後の値をチェックしましょう。
実践的なチェックリストと予防策
ここでは日常的に使えるチェックリストを示します。コーディング時に習慣化するとミスが減ります。
- 配列宣言時に意図したサイズを確認する
- ループ条件は常に < を使う(<= を避ける)
- 多次元配列は各次元の最大値を確認する
- ジャグ配列では各行のLengthを使う
- foreachやListで安全に処理する選択を検討する
トラブルシューティングの流れ
もしエラーが出たら、落ち着いて次の流れで原因を特定します。順序を守ると早く解決できます。
- エラーメッセージとスタックトレースを読む
- 問題の行を特定し、配列と添字の値を確認する
- ループ条件や初期化箇所を見直す
- 必要ならデバッガで変数の中身を追う
- foreachやListに置き換えて安全性を高める
まとめと学んだことの振り返り
C#の配列範囲外エラーは多くが添字の扱いミスで発生します。0始まり、Lengthの範囲、ループ条件の基本を習得すれば防げることがほとんどです。
実際の対処法としては、ループ条件の修正、foreachやListの活用、デバッガでの原因特定が有効です。ジャグ配列や多次元配列は特に注意しましょう。
この記事を参考にして、次回からはIndexOutOfRangeExceptionに悩まされることを減らしてください。コーディングの習慣を少し変えるだけで大きな効果が得られます。

#エンジニアとして、もっと自分の力を活かしたいあなたへ
「このまま今の職場にいて、成長できるんだろうか?」
C#を使っている方なら、一度はそう感じたことがあるかもしれません。
実は今、C#/.NETエンジニアの市場価値は高まっており、
年収アップ・フルリモート・自社開発企業など、選べる選択肢は確実に増えています。
もし今後、C#を活かして働きたい、あるいは開発現場で経験を積みたいとお考えなら…
自分に合った転職サービスを早めに知っておくことが大きな武器になります。
現役エンジニアからのサポート付き・無料で学べるスクール・社内SE特化の求人など、
転職支援サービスを厳選したまとめ記事をこちらで紹介しています。

ここまで読んでいただきありがとうございました。
コメント