本文へスキップ
BecomeCoder

C#エラー一覧

エラーメッセージに出てくるコード(CSxxxx・NUxxxx)や例外名で、意味・具体例・対策を逆引きできます。 エラーコードでページ内検索(Ctrl+F)するのが早道です。

コンパイルエラー(CSxxxx)

CS0246型または名前空間の名前が見つかりません

意味:その型(クラス名など)を認識できていません。usingの不足、パッケージ未導入、またはスペルミスが原因です。

具体例:

List<string> names = new List<string>();
CS0246: 型または名前空間の名前 'List<>' が見つかりませんでした

ファイル冒頭に「using System.Collections.Generic;」がないと発生します。

対策:

  1. 型名のスペルを確認する(大文字小文字も区別されます)
  2. エディタの電球アイコン(クイックフィックス)で「using ~ を追加」を選ぶ
  3. 外部ライブラリの型なら「dotnet add package パッケージ名」で導入されているか確認する
CS0103現在のコンテキストに存在しません

意味:変数・メソッドがその場所(スコープ)から見えません。スペルミス、宣言前の使用、スコープ外での参照が主な原因です。

具体例:

void PrintName() {
    Console.WriteLine(nam); // 変数名のタイプミス
}
void Other() {
    string name = "Aoi";
}
CS0103: 現在のコンテキストに 'nam' という名前は存在しません

対策:

  1. 変数・メソッド名のスペルを確認する("name" のつもりで "nam" などのタイプミスがないか)
  2. 変数が「使う行より前」で宣言されているか確認する
  3. { } の外(別のメソッドやブロック)で宣言した変数を使おうとしていないか確認する
CS1002; がありません

意味:文の終わりを示すセミコロンが抜けています。C#では改行ではなく「;」が文の区切りです。

具体例:

int total = 10 + 20
Console.WriteLine(total);
CS1002: ; が必要です

対策:

  1. エラー行またはその1行上の文末に「;」を追加する(多くの場合、直前の行が原因)
  2. メソッドの中括弧 { } の対応が崩れていないかも合わせて確認する
CS0029型を暗黙的に変換できません

意味:異なる型同士を代入しようとしています。C#は静的型付けのため、自動で変換されない組み合わせがあります。

具体例:

int age = "20"; // 文字列をintに直接代入
CS0029: 型 'string' を 'int' に暗黙的に変換できません

対策:

  1. 文字列を数値にしたい場合は「int.Parse("20")」または「int.TryParse」を使う
  2. 数値を文字列にしたい場合は「.ToString()」を使う
  3. 変換元・変換先の型を意図通りに合わせる(varで宣言してエラーの型を確認するのも有効)
CS0161のすべてのコード パスがreturnしません

意味:戻り値のある(voidでない)メソッドで、returnしない実行経路が残っています。特にif文の一部にだけreturnがある場合に起きます。

具体例:

int Judge(int score) {
    if (score >= 60) {
        return 1;
    }
    // elseがない → 60未満のときreturnされない
}
CS0161: 'Judge(int)': コード パスの一部が値を返しません

対策:

  1. if の条件に当てはまらない場合の return を elseブロックに追加する
  2. すべての分岐で確実にreturnされるか、メソッドの最後に共通のreturnを置く

実行時例外

NullReferenceExceptionオブジェクト参照がオブジェクト インスタンスに設定されていません

意味:null(値が存在しない状態)の変数のプロパティやメソッドに触っています。実務でも最頻出のエラーです。

具体例:

Person? person = FindPerson("Aoi"); // 見つからないとnullが返る
Console.WriteLine(person.Name); // person.Nameでnullを触る
System.NullReferenceException: 'オブジェクト参照がオブジェクト インスタンスに設定されていません。'

対策:

  1. エラーのスタックトレースで発生した行番号を特定する
  2. その行で「.」の左側にある変数のどれがnullになりうるかを確認する
  3. null安全の3点セット(?型注釈 / ?. / ??)で防御する。デバッガのブレークポイントで実際の値を見るのも有効
IndexOutOfRangeException配列またはコレクションの境界外です

意味:配列やリストに存在しない番号(インデックス)でアクセスしています。要素数より1小さい番号までしか存在しません。

具体例:

int[] scores = { 80, 90, 70 }; // 要素数は3(添字は0,1,2)
Console.WriteLine(scores[3]); // 存在しない添字3にアクセス
System.IndexOutOfRangeException: 'インデックスが配列の境界外です。'

対策:

  1. 要素数は「配列名.Length」またはリストなら「.Count」で確認する(添字は0始まりで要素数-1まで)
  2. ループで回す場合は「for (int i = 0; i < scores.Length; i++)」のように境界条件を見直す
  3. 存在するか不明な場合は事前に「i < scores.Length」等の条件チェックを入れる
InvalidOperationExceptionコレクションが変更されました / シーケンスに要素が含まれていません

意味:foreachで回している最中にコレクションを変更した、またはFirst()等が空のコレクションに対して呼ばれています。

具体例:

List<int> nums = new List<int> { 1, 2, 3 };
foreach (var n in nums) {
    if (n == 2) nums.Remove(n); // 反復中に変更
}
System.InvalidOperationException: 'コレクションが変更されました。列挙操作は実行されない可能性があります。'

対策:

  1. foreachの中でコレクション自体(Add/Remove)を変更しない。代わりに「for」で逆順に回すか、削除対象を別リストに集めてからRemoveする
  2. 「.First()」「.Single()」を使う場合は、事前に「.Any()」で要素の有無を確認するか、「.FirstOrDefault()」に置き換えてnullチェックする
FormatException文字列の形式が正しくありません

意味:数値に変換できない文字列を int.Parse 等に渡しています。ユーザー入力を扱うときに特に起きやすいです。

具体例:

string input = "abc";
int age = int.Parse(input); // 数値に変換できない
System.FormatException: '入力文字列の形式が正しくありません。'

対策:

  1. 「int.Parse」ではなく「int.TryParse」を使い、変換の成否をbool値で受け取って分岐する
  2. ユーザー入力を扱う場合は、変換前にTrim()で前後の空白を除去するのも有効
DivideByZeroExceptionゼロ除算エラー

意味:整数同士の割り算で右辺(除数)が0になっています。小数(double)同士の割り算では例外にならず、Infinityになります。

具体例:

int total = 100;
int count = 0;
int average = total / count; // 整数の0除算
System.DivideByZeroException: '0 で除算しようとしました。'

対策:

  1. 割り算の前に除数が0でないか「if (count != 0)」で確認する
  2. 0件のときの挙動(平均を0にする、メッセージを出すなど)を先に決めておく

NuGet・パッケージエラー(NUxxxx)

NU1101パッケージが見つかりません

意味:ネットワークの問題、またはNuGetのキャッシュ・パッケージソース設定が壊れています。パッケージ名のタイプミスのこともあります。

具体例:

error NU1101: パッケージ Newtonsoft.Josn が見つかりませんでした。ソースに一致するパッケージが見つかりません: nuget.org

上の例は「Josn」というタイプミス(正しくは Json)が原因のケースです。

対策:

  1. パッケージ名のスペルを確認する(NuGetサイトで正式名称を検索するのが確実)
  2. インターネット接続を確認する(社内ネットワークの場合はプロキシ設定も)
  3. ターミナルで「dotnet nuget locals all --clear」を実行してキャッシュを削除してから「dotnet restore」
  4. 直らない場合は「dotnet nuget list source」で nuget.org が有効になっているか確認する
NU1605パッケージのダウングレードが検出されました

意味:複数のパッケージが、同じ依存ライブラリの異なるバージョンを要求しています。片方が要求する新しいバージョンに揃える必要があります。

具体例:

error NU1605: 警告として扱われるエラー
パッケージ 'Microsoft.Extensions.Logging' がダウングレードされました: プロジェクトから 8.0.0 に、依存関係から 8.0.1 に

対策:

  1. エラーメッセージに表示されている「要求されたバージョン」(この例では8.0.1)を確認する
  2. csprojで該当パッケージのVersionを、要求されている高い方のバージョンに揃える
  3. 「dotnet restore」→「dotnet build」で解消を確認する
NU1102指定バージョンのパッケージが見つかりません

意味:csprojで指定したバージョン番号のパッケージがNuGetに存在しません。存在しないバージョンを手打ちしたときに起きます。

具体例:

error NU1102: バージョン (>= 99.0.0) を満たす Newtonsoft.Json が見つかりません

対策:

  1. NuGetのパッケージページで実在するバージョン番号を確認する
  2. csprojのVersion属性を、実在する最新の安定版(例: 13.0.3)に修正する
  3. Visual StudioのNuGetパッケージマネージャーからGUIで選び直すのも確実
NU1100対象のプラットフォームに対応するパッケージが見つかりません

意味:導入しようとしたパッケージが、プロジェクトのターゲットフレームワーク(例: net10.0)に対応していません。

具体例:

error NU1100: 'net10.0' 用のパッケージ 'SomeOldLibrary' の依存関係の解決に失敗しました

対策:

  1. パッケージのNuGetページで「対応フレームワーク」を確認する
  2. 対応する新しいバージョンが無いか確認する(メジャーバージョンを上げると対応していることが多い)
  3. 代替パッケージを探す(同じ機能を提供する後継ライブラリがないか検索する)
NETSDK1045現在のSDKではターゲットフレームワークがサポートされていません

意味:csprojで指定したターゲットフレームワーク(例: net10.0)に対応する.NET SDKがインストールされていません。

具体例:

error NETSDK1045: 現在の .NET SDK では、対象フレームワークが 'net10.0' である projects をビルドできません。

対策:

  1. 「dotnet --list-sdks」で現在インストールされているSDKのバージョンを確認する
  2. dotnet.microsoft.com から csprojが要求するバージョン以上の.NET SDKをインストールする
  3. インストール後はターミナル・Visual Studioを再起動してからビルドし直す