C#を用いた開発を進めている際、「c# 7.3 では使用できません。8.0 以上の言語バージョンをお使いください。」というエラーメッセージに直面することがあります。
このエラーは、プロジェクトで使用されているC#の言語バージョン設定よりも新しい文法を使用しようとした場合に発生します。
特に、以前のプロジェクトを最新のVisual Studioで開いた場合や、.NET Framework環境で新しい機能を使おうとした際によく見られる現象です。
本記事では、このエラーを迅速に解決するために必要な、C#言語バージョンの設定変更方法と、それぞれの設定値が持つ意味について詳しく解説します。
なぜ「C# 8.0以上の言語バージョン」が必要になるのか
C#の言語バージョンは、基本的にはプロジェクトがターゲットとしている.NETのランタイム(フレームワーク)に依存して自動的に決定されます。
例えば、.NET Frameworkをターゲットにしているプロジェクトでは、デフォルトの言語バージョンが C# 7.3 に固定されている ことが一般的です。
一方で、C# 8.0以降では「読み取り専用メンバー」や「スイッチ式」、「静的ローカル関数」といった非常に便利な機能が多数追加されています。
これらの最新機能を活用しようとすると、コンパイラは「現在の設定ではこの書き方は許可されていない」と判断し、エラーを返します。
つまり、エラーを解消するためには、プロジェクトの設定ファイルを手動で書き換えるか、開発環境の設定を調整して上位のバージョンを明示的に指定する必要があるのです。
C# 言語バージョンを 8.0 以上に変更する手順
言語バージョンを変更する最も確実な方法は、プロジェクトファイル(.csproj)を直接編集することです。
プロジェクトファイル(.csproj)を編集する
Visual Studioのソリューションエクスプローラーでプロジェクト名を右クリックし、「プロジェクト ファイルの編集」を選択してください。
開いたXML形式のファイル内で、<PropertyGroup> セクションを探します。
その中に <LangVersion> というタグを追加、または既存の値を書き換えることでバージョンを指定できます。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<!-- ここに言語バージョンを指定します -->
<LangVersion>8.0</LangVersion>
</PropertyGroup>
</Project>
このように記述してファイルを保存するだけで、即座にC# 8.0の機能が利用可能になります。
もし常に最新の機能を使用したい場合は、8.0 の代わりに latest と記述することをお勧めします。
利用可能な LangVersion の設定値一覧
設定できる値にはいくつか種類があり、プロジェクトの運用方針に合わせて選択する必要があります。
| 設定値 | 説明 |
|---|---|
| default | ターゲットフレームワークに基づいた最新のマイナーバージョンを選択します。 |
| latest | インストールされているSDKで利用可能な最新のマイナーバージョンを使用します。 |
| latestMajor | インストールされているSDKで利用可能な最新のメジャーバージョンを使用します。 |
| preview | プレビュー版として提供されている最新の言語機能を使用します。 |
| 8.0, 9.0, 10.0… | 特定のバージョンを明示的に指定します。 |
特定のバージョンに依存したくない場合は、latest を指定しておくのが最も汎用的な解決策となります。
Visual Studio のプロパティ画面から設定を確認する
以前のVisual StudioではGUI上から簡単に変更できましたが、最近のバージョンではプロジェクトファイルを直接編集するスタイルが推奨されています。
ただし、現在どのバージョンが適用されているかを確認するには、プロジェクトのプロパティ画面が役立ちます。
プロジェクトのプロパティを開き、「ビルド」タブを選択した後、「詳細設定」ボタン(表示されない場合は検索窓を利用)を探してください。
ここで言語バージョンがグレーアウトされている場合、それはターゲットフレームワークによって自動的に決定されていることを意味します。
この自動決定の仕組みを上書きするために、前述した .csproj の直接編集が必要になるのです。
C# 8.0 でエラーが発生しやすいコード例
実際にどのようなコードを書くと「C# 7.3では使用できません」というエラーが発生するのか、具体例を見てみましょう。
スイッチ式(Switch Expressions)
C# 8.0から導入されたスイッチ式は、従来のswitch文よりも簡潔に記述できるため非常に人気があります。
using System;
public class Program
{
public static void Main()
{
int numericDay = 1;
// C# 8.0以降で使用可能なスイッチ式
string dayName = numericDay switch
{
1 => "Monday",
2 => "Tuesday",
_ => "Other Day"
};
Console.WriteLine(dayName);
}
}
このコードを C# 7.3 以下の環境でコンパイルしようとすると、構文エラーが発生します。
CS8370: 機能 'スイッチ式' は C# 7.3 では使用できません。8.0 以上の言語バージョンをお使いください。
このようなエラーが出た際は、速やかに <LangVersion> を 8.0 以上に設定しましょう。
null 許容参照型(Nullable Reference Types)
C# 8.0の最も大きな変更点の一つが、null 許容参照型の導入です。
参照型の変数に null が入る可能性があるかどうかをコンパイラがチェックする機能ですが、これも 8.0 未満では動作しません。
// null 許容参照型の有効化
#nullable enable
public class Person
{
// C# 8.0以降では、? を付けることで null を許容することを明示できる
public string? Name { get; set; }
}
#nullable enable という記述自体が、C# 8.0 以降の機能を前提としているため、古いバージョン設定では無視されるかエラーとなります。
一括で設定を変更する方法:Directory.Build.props
ソリューション内に大量のプロジェクトが存在する場合、一つひとつの .csproj ファイルを編集するのは手間がかかります。
そのような場合は、ソリューションのルートディレクトリに Directory.Build.props というファイルを作成してください。
<Project>
<PropertyGroup>
<LangVersion>latest</LangVersion>
</PropertyGroup>
</Project>
このファイルを配置するだけで、そのフォルダ配下にある全てのプロジェクトに対して、一括で最新の言語バージョンを適用することができます。
プロジェクト間での一貫性を保つためにも、大規模な開発ではこの手法が強く推奨されます。
言語バージョンを上げる際の注意点
言語バージョンを上げることは基本的にメリットしかありませんが、いくつか注意すべき点があります。
ランタイムのサポート範囲
C# 8.0 の機能の中には、ランタイム(CLR)側のサポートを必要とするものがあります。
例えば、「デフォルトインターフェイスメソッド」などの機能は、.NET Core 3.0 以降や .NET 5 以降のランタイムが必要です。
.NET Framework で C# 8.0 以上を使用する場合、すべての機能が完全に動作するわけではない点に注意してください。
文法上の機能(スイッチ式など)は動作しますが、ランタイムに依存する新機能は実行時にエラーになるか、コンパイル時に警告が出る場合があります。
チーム開発での共有
個人の開発環境で latest を指定していても、チームメンバーの SDK バージョンが古いとビルドエラーを引き起こす可能性があります。
チームで開発している場合は、使用する SDK の最小バージョンを global.json で定義しておくなど、開発環境の同期を図るのがベストプラクティスです。
まとめ
「C# 7.3 では使用できません」というエラーは、適切な設定を行うだけで簡単に解決できる問題です。
基本的にはプロジェクトファイル(.csproj)に <LangVersion>8.0</LangVersion> または <LangVersion>latest</LangVersion> を追記することで対応可能です。
C# 8.0 以降には、コードの安全性と可読性を飛躍的に高める機能が凝縮されています。
エラーをきっかけに環境をモダンにアップデートし、より効率的なプログラミングを実現しましょう。
もし今後も同様のエラーが発生した際は、まず .csproj の LangVersion 設定を確認することを忘れないでください。
