MeWrite Docs

ArgumentOutOfRangeException

引数の値が許容範囲外の場合に発生するC#の例外

概要

System.ArgumentOutOfRangeExceptionは、メソッドに渡された引数の値が許容範囲外の場合に発生します。リストや配列のインデックス範囲外アクセスが最も一般的な原因です。

エラーメッセージ

System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. (Parameter 'index')
   at System.Collections.Generic.List`1.get_Item(Int32 index)
   at MyApp.Program.Main(String[] args) in Program.cs:line 15

原因

  1. インデックス範囲外: リストや配列のサイズを超えるインデックスでアクセス
  2. 空のコレクション: 要素が0件のコレクションに対してインデックスアクセス
  3. 負のインデックス: 負の値をインデックスとして使用
  4. Substringの範囲外: 文字列長を超える位置を指定

解決策

1. 境界チェックを行う

アクセス前にインデックスの範囲を確認する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
var list = new List<string> { "a", "b", "c" };
int index = 5;

// NG: 範囲外アクセス
var item = list[index]; // ArgumentOutOfRangeException

// OK: 境界チェック
if (index >= 0 && index < list.Count)
{
    var item = list[index];
    Console.WriteLine(item);
}
else
{
    Console.WriteLine($"インデックス {index} は範囲外です (0-{list.Count - 1})");
}

2. ElementAtOrDefaultを使用する

1
2
3
4
5
6
7
8
9
var list = new List<string> { "a", "b", "c" };

// 範囲外の場合はdefaultを返す
var item = list.ElementAtOrDefault(10); // null(例外なし)

if (item is not null)
{
    Console.WriteLine(item);
}

3. Guard Clauseを実装する

メソッドの入口で引数を検証する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
public class PaginationService
{
    public List<T> GetPage<T>(List<T> items, int pageNumber, int pageSize)
    {
        // .NET 8以降
        ArgumentOutOfRangeException.ThrowIfNegativeOrZero(pageNumber);
        ArgumentOutOfRangeException.ThrowIfNegativeOrZero(pageSize);

        // .NET 7以前
        if (pageNumber <= 0)
            throw new ArgumentOutOfRangeException(nameof(pageNumber),
                "ページ番号は1以上を指定してください");

        return items
            .Skip((pageNumber - 1) * pageSize)
            .Take(pageSize)
            .ToList();
    }
}

4. 文字列操作での対処

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
string text = "Hello";

// NG: 範囲外
var sub = text.Substring(3, 10); // ArgumentOutOfRangeException

// OK: 長さを考慮
int start = 3;
int length = Math.Min(10, text.Length - start);
var sub = text.Substring(start, length);

// OK: Span/Rangeを使用(C# 8.0以降)
var sub = text.AsSpan()[3..]; // "lo"

// OK: 安全な切り出しメソッド
static string SafeSubstring(string str, int start, int length)
{
    if (start >= str.Length) return string.Empty;
    return str.Substring(start, Math.Min(length, str.Length - start));
}

5. コレクション初期化の確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// NG: 空リストへのアクセス
var results = new List<int>();
var first = results[0]; // ArgumentOutOfRangeException

// OK: 要素の存在を確認
if (results.Count > 0)
{
    var first = results[0];
}

// OK: パターンマッチング(C# 11以降のリストパターン)
if (results is [var first, ..])
{
    Console.WriteLine($"先頭要素: {first}");
}

関連エラー

C# の他のエラー

最終更新: 2026-02-03