C# で CS0246「型または名前空間名が見つかりませんでした」が解決できない
CS0246 は型の名前解決に失敗したという報告で、原因は using の不足・参照の不足・つづり誤りのいずれか。
エラー文が挙げる 2 択のどちらなのかを先に切り分ける。
公開:
要約
CS0246 のメッセージは「The type or namespace name could not be found (are you missing a using directive or an assembly reference?)」で、原因の候補を 2 つ挙げています。
つまり using が足りないか、参照そのものが無いかのどちらかです。
まずどちらなのかを切り分けます。
判断は簡単で、パッケージやプロジェクトを追加した覚えがあるかで分かれます。
dotnet restore
dotnet buildよくある原因
usingが足りない: 型は参照先に存在するが、名前空間を開いていない。
IDE を使わずに書いているときに起きやすい。- 参照が無い: そもそもその型を含むパッケージやプロジェクトを参照していない。
Microsoft のドキュメントは CS0012 / CS0234 / CS0246 をまとめて「アセンブリ参照が足りないことを示すエラー」として扱っている。 - 復元されていない:
.csprojにPackageReferenceはあるのに、パッケージが取得されていない。
CI やクローン直後によくある状態。 - つづり違い・対象フレームワーク違い: 型名の大文字小文字が違う、または対象フレームワークに存在しない型を使っている。
同じ名前で名前空間だけが違う型もある。
解決策
1. 必要な using を足す
エラーが指す型の名前空間を調べて追加します。
using System.Text.Json;
var json = JsonSerializer.Serialize(new { name = "dekinai" });ファイル単位で書く代わりに、プロジェクト全体へ効かせることもできます。
<ItemGroup>
<Using Include="System.Text.Json" />
</ItemGroup>2. 参照を追加する
パッケージの場合とプロジェクト参照の場合で、コマンドが変わります。
# NuGet パッケージ
dotnet add package Newtonsoft.Json
# 同じソリューション内の別プロジェクト
dotnet add reference ../Core/Core.csproj3. 復元してからビルドする
参照は書いてあるのに解決されない場合は、復元を挟みます。
dotnet restore
dotnet buildMicrosoft のドキュメントは、パッケージ操作の後に解決できなくなったときの手順として、キャッシュを消してからの復元も挙げています。
dotnet nuget locals all --clear
dotnet restore4. クリーンしてから再ビルドする
古い成果物が残って、直したはずの参照が反映されないことがあります。
dotnet clean
dotnet buildこれでも解決しない場合は、対象フレームワークを確認してください。.csproj の TargetFramework が古いと、新しい API を含む型は見つかりません。
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>SDK 自体が想定と違うバージョンで動いているケースもあります。
その切り分けは /csharp/sdk-not-found-global-json/ を参照してください。