できない.dev

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

よくある原因

  1. using が足りない: 型は参照先に存在するが、名前空間を開いていない。
    IDE を使わずに書いているときに起きやすい。
  2. 参照が無い: そもそもその型を含むパッケージやプロジェクトを参照していない。
    Microsoft のドキュメントは CS0012 / CS0234 / CS0246 をまとめて「アセンブリ参照が足りないことを示すエラー」として扱っている。
  3. 復元されていない: .csprojPackageReference はあるのに、パッケージが取得されていない。
    CI やクローン直後によくある状態。
  4. つづり違い・対象フレームワーク違い: 型名の大文字小文字が違う、または対象フレームワークに存在しない型を使っている。
    同じ名前で名前空間だけが違う型もある。

解決策

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.csproj

3. 復元してからビルドする

参照は書いてあるのに解決されない場合は、復元を挟みます。

dotnet restore
dotnet build

Microsoft のドキュメントは、パッケージ操作の後に解決できなくなったときの手順として、キャッシュを消してからの復元も挙げています。

dotnet nuget locals all --clear
dotnet restore

4. クリーンしてから再ビルドする

古い成果物が残って、直したはずの参照が反映されないことがあります。

dotnet clean
dotnet build

これでも解決しない場合は、対象フレームワークを確認してください。.csprojTargetFramework が古いと、新しい API を含む型は見つかりません。

<PropertyGroup>
  <TargetFramework>net8.0</TargetFramework>
</PropertyGroup>

SDK 自体が想定と違うバージョンで動いているケースもあります。
その切り分けは /csharp/sdk-not-found-global-json/ を参照してください。

この記事は役立ちましたか?