C#エラー一覧
エラーメッセージに出てくるコード(CSxxxx・NUxxxx)や例外名で、意味・具体例・対策を逆引きできます。 エラーコードでページ内検索(Ctrl+F)するのが早道です。
コンパイルエラー(CSxxxx)
CS0246型または名前空間の名前が見つかりません
意味:その型(クラス名など)を認識できていません。usingの不足、パッケージ未導入、またはスペルミスが原因です。
具体例:
List<string> names = new List<string>();CS0246: 型または名前空間の名前 'List<>' が見つかりませんでしたファイル冒頭に「using System.Collections.Generic;」がないと発生します。
対策:
- 型名のスペルを確認する(大文字小文字も区別されます)
- エディタの電球アイコン(クイックフィックス)で「using ~ を追加」を選ぶ
- 外部ライブラリの型なら「dotnet add package パッケージ名」で導入されているか確認する
CS0103現在のコンテキストに存在しません
意味:変数・メソッドがその場所(スコープ)から見えません。スペルミス、宣言前の使用、スコープ外での参照が主な原因です。
具体例:
void PrintName() {
Console.WriteLine(nam); // 変数名のタイプミス
}
void Other() {
string name = "Aoi";
}CS0103: 現在のコンテキストに 'nam' という名前は存在しません対策:
- 変数・メソッド名のスペルを確認する("name" のつもりで "nam" などのタイプミスがないか)
- 変数が「使う行より前」で宣言されているか確認する
- { } の外(別のメソッドやブロック)で宣言した変数を使おうとしていないか確認する
CS1002; がありません
意味:文の終わりを示すセミコロンが抜けています。C#では改行ではなく「;」が文の区切りです。
具体例:
int total = 10 + 20
Console.WriteLine(total);CS1002: ; が必要です対策:
- エラー行またはその1行上の文末に「;」を追加する(多くの場合、直前の行が原因)
- メソッドの中括弧 { } の対応が崩れていないかも合わせて確認する
CS0029型を暗黙的に変換できません
意味:異なる型同士を代入しようとしています。C#は静的型付けのため、自動で変換されない組み合わせがあります。
具体例:
int age = "20"; // 文字列をintに直接代入CS0029: 型 'string' を 'int' に暗黙的に変換できません対策:
- 文字列を数値にしたい場合は「int.Parse("20")」または「int.TryParse」を使う
- 数値を文字列にしたい場合は「.ToString()」を使う
- 変換元・変換先の型を意図通りに合わせる(varで宣言してエラーの型を確認するのも有効)
CS0161のすべてのコード パスがreturnしません
意味:戻り値のある(voidでない)メソッドで、returnしない実行経路が残っています。特にif文の一部にだけreturnがある場合に起きます。
具体例:
int Judge(int score) {
if (score >= 60) {
return 1;
}
// elseがない → 60未満のときreturnされない
}CS0161: 'Judge(int)': コード パスの一部が値を返しません対策:
- if の条件に当てはまらない場合の return を elseブロックに追加する
- すべての分岐で確実にreturnされるか、メソッドの最後に共通のreturnを置く
実行時例外
NullReferenceExceptionオブジェクト参照がオブジェクト インスタンスに設定されていません
意味:null(値が存在しない状態)の変数のプロパティやメソッドに触っています。実務でも最頻出のエラーです。
具体例:
Person? person = FindPerson("Aoi"); // 見つからないとnullが返る
Console.WriteLine(person.Name); // person.Nameでnullを触るSystem.NullReferenceException: 'オブジェクト参照がオブジェクト インスタンスに設定されていません。'対策:
- エラーのスタックトレースで発生した行番号を特定する
- その行で「.」の左側にある変数のどれがnullになりうるかを確認する
- null安全の3点セット(?型注釈 / ?. / ??)で防御する。デバッガのブレークポイントで実際の値を見るのも有効
IndexOutOfRangeException配列またはコレクションの境界外です
意味:配列やリストに存在しない番号(インデックス)でアクセスしています。要素数より1小さい番号までしか存在しません。
具体例:
int[] scores = { 80, 90, 70 }; // 要素数は3(添字は0,1,2)
Console.WriteLine(scores[3]); // 存在しない添字3にアクセスSystem.IndexOutOfRangeException: 'インデックスが配列の境界外です。'対策:
- 要素数は「配列名.Length」またはリストなら「.Count」で確認する(添字は0始まりで要素数-1まで)
- ループで回す場合は「for (int i = 0; i < scores.Length; i++)」のように境界条件を見直す
- 存在するか不明な場合は事前に「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: 'コレクションが変更されました。列挙操作は実行されない可能性があります。'対策:
- foreachの中でコレクション自体(Add/Remove)を変更しない。代わりに「for」で逆順に回すか、削除対象を別リストに集めてからRemoveする
- 「.First()」「.Single()」を使う場合は、事前に「.Any()」で要素の有無を確認するか、「.FirstOrDefault()」に置き換えてnullチェックする
FormatException文字列の形式が正しくありません
意味:数値に変換できない文字列を int.Parse 等に渡しています。ユーザー入力を扱うときに特に起きやすいです。
具体例:
string input = "abc";
int age = int.Parse(input); // 数値に変換できないSystem.FormatException: '入力文字列の形式が正しくありません。'対策:
- 「int.Parse」ではなく「int.TryParse」を使い、変換の成否をbool値で受け取って分岐する
- ユーザー入力を扱う場合は、変換前にTrim()で前後の空白を除去するのも有効
DivideByZeroExceptionゼロ除算エラー
意味:整数同士の割り算で右辺(除数)が0になっています。小数(double)同士の割り算では例外にならず、Infinityになります。
具体例:
int total = 100;
int count = 0;
int average = total / count; // 整数の0除算System.DivideByZeroException: '0 で除算しようとしました。'対策:
- 割り算の前に除数が0でないか「if (count != 0)」で確認する
- 0件のときの挙動(平均を0にする、メッセージを出すなど)を先に決めておく
NuGet・パッケージエラー(NUxxxx)
NU1101パッケージが見つかりません
意味:ネットワークの問題、またはNuGetのキャッシュ・パッケージソース設定が壊れています。パッケージ名のタイプミスのこともあります。
具体例:
error NU1101: パッケージ Newtonsoft.Josn が見つかりませんでした。ソースに一致するパッケージが見つかりません: nuget.org上の例は「Josn」というタイプミス(正しくは Json)が原因のケースです。
対策:
- パッケージ名のスペルを確認する(NuGetサイトで正式名称を検索するのが確実)
- インターネット接続を確認する(社内ネットワークの場合はプロキシ設定も)
- ターミナルで「dotnet nuget locals all --clear」を実行してキャッシュを削除してから「dotnet restore」
- 直らない場合は「dotnet nuget list source」で nuget.org が有効になっているか確認する
NU1605パッケージのダウングレードが検出されました
意味:複数のパッケージが、同じ依存ライブラリの異なるバージョンを要求しています。片方が要求する新しいバージョンに揃える必要があります。
具体例:
error NU1605: 警告として扱われるエラー
パッケージ 'Microsoft.Extensions.Logging' がダウングレードされました: プロジェクトから 8.0.0 に、依存関係から 8.0.1 に対策:
- エラーメッセージに表示されている「要求されたバージョン」(この例では8.0.1)を確認する
- csprojで該当パッケージのVersionを、要求されている高い方のバージョンに揃える
- 「dotnet restore」→「dotnet build」で解消を確認する
NU1102指定バージョンのパッケージが見つかりません
意味:csprojで指定したバージョン番号のパッケージがNuGetに存在しません。存在しないバージョンを手打ちしたときに起きます。
具体例:
error NU1102: バージョン (>= 99.0.0) を満たす Newtonsoft.Json が見つかりません対策:
- NuGetのパッケージページで実在するバージョン番号を確認する
- csprojのVersion属性を、実在する最新の安定版(例: 13.0.3)に修正する
- Visual StudioのNuGetパッケージマネージャーからGUIで選び直すのも確実
NU1100対象のプラットフォームに対応するパッケージが見つかりません
意味:導入しようとしたパッケージが、プロジェクトのターゲットフレームワーク(例: net10.0)に対応していません。
具体例:
error NU1100: 'net10.0' 用のパッケージ 'SomeOldLibrary' の依存関係の解決に失敗しました対策:
- パッケージのNuGetページで「対応フレームワーク」を確認する
- 対応する新しいバージョンが無いか確認する(メジャーバージョンを上げると対応していることが多い)
- 代替パッケージを探す(同じ機能を提供する後継ライブラリがないか検索する)
NETSDK1045現在のSDKではターゲットフレームワークがサポートされていません
意味:csprojで指定したターゲットフレームワーク(例: net10.0)に対応する.NET SDKがインストールされていません。
具体例:
error NETSDK1045: 現在の .NET SDK では、対象フレームワークが 'net10.0' である projects をビルドできません。対策:
- 「dotnet --list-sdks」で現在インストールされているSDKのバージョンを確認する
- dotnet.microsoft.com から csprojが要求するバージョン以上の.NET SDKをインストールする
- インストール後はターミナル・Visual Studioを再起動してからビルドし直す