目次

概要

ここでは、C# の言語バージョンを明示的に指定する方法について説明します。

言語バージョンの指定方法

C# コンパイラーのオプションで、言語バージョンを明示的に指定することができます。 特に何も指定しなかった場合、後述するdefaultに当たる挙動をします。

言語バージョンは、Visual Studio 上で行う場合、プロジェクトのプロパティを開いて、以下の場所から設定できます。

言語バージョン オプション

プロジェクト ファイル(拡張子が csproj のファイル)を直接書き換える場合、PropertyGroupの下にLangVersionタグを書きます(タグ内に書けるオプションの種類は後述します)。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFrameworks>netcoreapp2.2</TargetFrameworks>
    <LangVersion>latest</LangVersion>
  </PropertyGroup>

</Project>

また、C# コンパイラー(csc)を直接使う場合には、-langversionオプションを指定します (書けるオプションは上記の LangVersion タグと同じ)。

csc -langversion:latest sample.cs

LangVersion

前述の、csproj ファイル中の LangVersion タグや、csc コマンドの -langversion オプションでは、以下の2通りのオプション指定ができます。

  • 7.0 など、バージョン番号を直接指定
  • latest など、後述するいくつかの文字列

前者の番号指定では、メジャー バージョンであれば 7 など、小数点は省略可能です。

後者は、defaultlatestlatestMajorpreview の4種類があります(大文字・小文字は区別しません)。オプションを指定しなかった場合はdefault扱いになります。 ただ、これらの挙動は Visual Studio 2019/C# 8.0 世代のコンパイラーかそれ以前かで異なります。

古い挙動

C# 7.0 以前のコンパイラーにはそもそも番号指定か default しかなかったので、 実質的には 7.1 ~ 7.3 までの挙動になります。 以下のような挙動でした。

  • default: 最新のメジャー バージョン
  • latest: マイナー バージョンを含む最新バージョン

要するに、特に何も指定しなければ C# 7.0 になりました。

新しい挙動

C# 8.0 世代以降のコンパイラーでは以下のような挙動になります。

  • default: マイナー バージョンを含む最新バージョン(ただし、プレビュー機能は除く)
  • latest: マイナー バージョンを含む最新バージョン(ただし、プレビュー機能は除く)
  • latestMajor: 最新のメジャー バージョン
  • preview: プレビュー版を含む最新バージョン

要するに、default (オプション未指定)の時の挙動が latest と同じになりました。 代わりに、latestMajorpreview が追加されました。

バグ修正

実のところ、古いバージョンを明示しても、完全に昔の挙動になるとは限りません。 「バグ修正」という扱いのものは、バージョン指定によらず挙動が変わります。

例えば、以下のようなものがあります。

これらはそれぞれ、C# 7.1 世代、8.0 世代のコンパイラーから入ったものですが、 それ以降のコンパイラーを使った場合、たとえ LangVersion を明示的に 7.0 にしたとしてもコンパイルできます。

極々稀ではありますが、深刻なバグの場合には挙動を変えてでも直す(破壊的変更になる)こともあるのでご注意ください。

更新履歴

ブログ