概要
ここでは、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
など、小数点は省略可能です。
後者は、default
、latest
、latestMajor
、preview
の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
と同じになりました。
代わりに、latestMajor
と preview
が追加されました。
バグ修正
実のところ、古いバージョンを明示しても、完全に昔の挙動になるとは限りません。 「バグ修正」という扱いのものは、バージョン指定によらず挙動が変わります。
例えば、以下のようなものがあります。
これらはそれぞれ、C# 7.1 世代、8.0 世代のコンパイラーから入ったものですが、
それ以降のコンパイラーを使った場合、たとえ LangVersion
を明示的に 7.0
にしたとしてもコンパイルできます。
極々稀ではありますが、深刻なバグの場合には挙動を変えてでも直す(破壊的変更になる)こともあるのでご注意ください。