C#のプログラムを開発している際に、これまで動いていたコードを参考にしたり、最新のライブラリを導入したりすると、「エラー CS8370:機能は C# 7.3 では使用できません。9.0 以上の言語バージョンをお使いください」というメッセージが表示されることがあります。

このエラーは、プロジェクトで使用されているC#のコンパイラ設定が古く、記述した新しい構文を理解できていないことが原因です。

特に古いプロジェクトを長期間メンテナンスしている場合や、.NET Frameworkから移行したばかりの環境で頻繁に発生します。

本記事では、このエラーを迅速に解決するために、C#の言語バージョンを9.0以上にアップグレードする具体的な手順を解説します。

開発環境の構成を正しく理解し、最新の機能を活用してコーディングの効率を高めていきましょう。

エラーが発生する主な原因

このエラーが発生する根本的な理由は、プロジェクトファイル内で指定されているC#の言語バージョンが、使用しようとしている構文の登場時期よりも古いことにあります。

C# 7.3は長い間、.NET Frameworkにおける標準的なバージョンとして広く普及していました。

しかし、C# 9.0以降では、データの不変性を保証する「レコード型」や、オブジェクトの初期化を安全に行う「init専用セッター」などの強力な機能が多数追加されています。

これらの新しい構文をエディタに入力しても、プロジェクトの設定が7.3に固定されていると、コンパイラはそれを「未知の構文」として認識し、ビルドを中断してしまいます。

また、Visual StudioなどのIDE(統合開発環境)のバージョンが古い場合や、プロジェクトテンプレートが古い形式のままになっていることも原因の一つです。

特に、「ターゲットフレームワーク」と「言語バージョン」のデフォルト値の関係を理解しておくことが解決への近道となります。

デフォルトの言語バージョンとフレームワークの関係

C#の言語バージョンは、通常、プロジェクトがターゲットとしている.NETのバージョンによって自動的に決定されます。

一般的に、.NET Frameworkをターゲットにしているプロジェクトでは、デフォルトの言語バージョンがC# 7.3に制限される傾向があります。

一方で、.NET 5以降のモダンな.NET環境では、自動的にC# 9.0以上のバージョンが選択されるようになっています。

以下の表は、ターゲットフレームワークとデフォルトで使用されるC#バージョンの関係をまとめたものです。

ターゲットフレームワークデフォルトのC#言語バージョン
.NET Framework (すべて)C# 7.3
.NET Core 3.xC# 8.0
.NET 5.0C# 9.0
.NET 6.0C# 10.0
.NET 7.0以降C# 11.0 / 12.0 / 13.0以上

この表から分かる通り、.NET Frameworkを使用しているプロジェクトで新しい構文を使いたい場合は、明示的な設定変更が必要になります。

言語バージョンを9.0以上に更新する方法

エラーを解消するために、プロジェクトの設定を書き換えて言語バージョンを強制的に引き上げる手順を説明します。

最も確実で推奨される方法は、プロジェクトファイル (.csproj) を直接編集する手法です。

プロジェクトファイル (.csproj) の編集

Visual Studioを使用している場合、ソリューションエクスプローラーで対象のプロジェクトを右クリックし、「プロジェクトファイルの編集」を選択します。

ファイルが開いたら、<PropertyGroup> セクションの中に <LangVersion> タグを探してください。

もしそのタグが存在しない場合は、以下のように新しく追記を行います。

XML
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net48</TargetFramework>
    <!-- 以下の1行を追加または編集して9.0以上に指定します -->
    <LangVersion>9.0</LangVersion>
  </PropertyGroup>
</Project>

この <LangVersion> の値を 9.0 に書き換えて保存することで、コンパイラはC# 9.0の機能を解釈できるようになります。

もし、常に最新の機能を利用したい場合は、特定の数値ではなく latest と記述することをお勧めします。

latest を指定すると、インストールされているSDKがサポートする最新の安定版C#バージョンが自動的に適用されます。

Visual Studio の UI から設定を確認する

以前のVisual Studioではプロパティ画面から言語バージョンを簡単に変更できましたが、最近のバージョンではこのUIが制限されている場合があります。

基本的には前述したプロジェクトファイルの直接編集が推奨されますが、現在の設定を確認する手段としてプロパティ画面も有効です。

プロジェクトを右クリックして「プロパティ」を開き、「ビルド」タブを選択した後、「詳細設定」ボタンを探します。

そこで「言語バージョン」の項目がグレーアウトされている場合は、前述の .csproj の編集による強制指定が必要です。

C# 9.0 以降で利用可能になる主要な新機能

言語バージョンを9.0以上に引き上げると、どのようなコードが書けるようになるのかを具体的に見ていきましょう。

エラーの原因となりやすい代表的な機能をいくつか紹介します。

レコード型 (record)

C# 9.0の目玉機能の一つが record です。

これは、データを保持することに特化したクラスの簡略版であり、値に基づいた等価比較を自動的にサポートします。

C#
// C# 9.0 以上の構文
public record Person(string FirstName, string LastName);

class Program
{
    static void Main()
    {
        var p1 = new Person("Taro", "Yamada");
        var p2 = new Person("Taro", "Yamada");
        
        // クラスと異なり、値が同じなら true になる
        Console.WriteLine(p1 == p2); 
    }
}
実行結果
True

C# 7.3以前の環境でこのコードを記述すると、record キーワードが解釈できず、まさに今回のエラーが発生します。

初期化のみのプロパティ (init)

オブジェクトの作成時のみ値を設定でき、その後は読み取り専用にしたい場合に便利なのが init アクセサです。

従来の readonly よりも柔軟なオブジェクト初期化子を利用できるようになります。

C#
public class Product
{
    // 初期化時のみ書き込み可能
    public string Name { get; init; }
    public decimal Price { get; init; }
}

var item = new Product { Name = "Laptop", Price = 150000 };
// item.Name = "PC"; // これはコンパイルエラーになるため安全

この機能もC# 9.0以上が必要であり、古いバージョンでは set または private set しか使用できません。

バージョン変更時の注意点とトラブルシューティング

言語バージョンを上げる際には、いくつか留意すべきポイントがあります。

まず、SDKのバージョンが古いと、そもそも新しい言語バージョンをサポートしていない場合があります。

C# 9.0を利用するには、最低でも .NET 5 SDK 以上がインストールされている必要があります。

コマンドプロンプトやターミナルで dotnet --version を実行し、適切なSDKが導入されているか確認してください。

また、ターゲットフレームワークが .NET Framework 4.8 などの古い環境のまま LangVersion だけを上げると、一部のランタイム機能(特定のパターンマッチングや共変戻り値など)が動作しない、あるいは追加のライブラリ(Microsoft.Bcl.HashCodeなど)が必要になるケースがあります。

もし可能であれば、ターゲットフレームワーク自体を .NET 6 や .NET 8 などの長期サポート (LTS) バージョンに移行することを検討してください。

これにより、言語バージョンの不整合に悩まされることなく、最新の文法と最高のパフォーマンスを享受できるようになります。

まとめ

「C# 7.3では使用できません」というエラーは、開発環境が最新のC#構文に追いついていないことを示すシグナルです。

解決策として、プロジェクトファイル .csproj<LangVersion>9.0</LangVersion> または <LangVersion>latest</LangVersion> を追記することで、即座に新しい機能を利用できるようになります。

C# 9.0以降で導入された recordinit などの機能を活用することは、コードの可読性と安全性を高める上で非常に重要です。

エラーが出た際には、単に構文を古く書き直すのではなく、この機会にプロジェクトの言語バージョンを適切にアップデートし、モダンな開発環境を整えましょう。