web-dev-qa-db-ja.com

C#コンパイラバージョンと言語バージョンの違い

フレームワークバージョンとC#バージョンは同じものだと思っていた時期があったので、次のフレームワークバージョンをコンピュータにインストールしたら、それを使用する必要があります。

次に、フレームワークがC#バージョンと直接リンクされておらず、同じマシン上で複数のC#コンパイラーが共存できるため、コンパイラーとC#バージョンは同じである必要があることがわかりました。

これで、コンパイラのバージョンとC#のバージョンが同じではないことがわかりました...


Visual Studioコマンドプロンプト(2010):C:\>csc

Microsoft(R)Visual C#コンパイラバージョン4。0.30319.33440
Microsoft(R).NET Framework4.5の場合


VSの開発者コマンドプロンプト2013C:\>csc

Microsoft(R)Visual C#コンパイラバージョン12。0.30110.0
C#5の場合


enter image description here

私たちはそれを見ることができます
-VS2010はC#4にコンパイラバージョン4.0を使用します(??明示的に言及されていないため、私はそれを推測できます)。
-VS2013は、C#5のコンパイラバージョン12.0を使用します(これは明示的に言及されています)

異なる言語バージョンを使用してコンパイルすると異なる結果が生じる可能性があることを知っている ユーザーに

質問

  • どのC#バージョン(コンパイラのものではなく言語のもの)がVSを使用して具体的なプロジェクトを構築しているのかを知る方法は?

  • C#コンパイラ言語の間に厳密で明確で透過的なリンクがありますか? )バージョン?

  • Visual Studioに(あるStudioバージョンから別のバージョンへの移行の問題の場合)具体的なソリューションに異なるコンパイラバージョンを使用するように指示できますか?

25
serhio

誰も十分な答えを出さないので、今から試してみます。

まず、C#のバージョン履歴はMicrosoftによって公開されています(明らかにMVPの投稿からのものです)。

https://docs.Microsoft.com/en-us/dotnet/csharp/whats-new/csharp-version-history

そのため、新しいリリースごとに追加される新機能を簡単に確認できます。

次に、最初は.NETFrameworkの一部であったコンパイラリリースについて説明します。

以下にいくつかのマイルストーンを示します(100%正しくない可能性があり、一部のバージョンはスキップされる可能性があります)。

  • csc.exe 1.0(?)for .NET Framework 1.0(C#1.0を実装)。
  • csc.exe 2.0(Microsoft(R)Visual C#2005コンパイラバージョン8.00.50727.8745)for .NET Framework 2.0(C#2.0および互換性のための1.0を実装)。
  • csc.exe 3.5(Microsoft(R)Visual C#2008コンパイラバージョン3.5.30729.8763)for .NET Framework 3.5(C#3.0以前のバージョンを実装)。
  • csc.exe 4.0(?)for .NET Framework 4.0(C#4.0以前を実装)。
  • csc.exe 4.x(Microsoft(R)Visual C#コンパイラバージョン4.7.2053.0のように).NET Framework 4.5以降(C#5.0以前を実装)。バージョン番号は、マシンの.NET Framework(4.5.0から4.7.1)に基づいて、大きく異なる(4.xから12.x)ことに注意してください。

次に、Microsoftは古いcsc.exeを廃止し(ネイティブ実行可能ファイルであったため)、代わりにRoslynベースのコンパイラを出荷しました(ただし、まだcsc.exe)。それまでの間、C#コンパイラは.NET Frameworkの一部ではなく、VSの一部です。

同時に、C#コンパイラ、言語バージョン、および.NET Frameworkが完全に分離されているため、マルチターゲティングを簡単に使用できます。

  • Roslyn csc.exe 1.x(?)はC#6.0以前を実装しています。 VS2015に同梱されています。
  • Roslyn csc.exe 2.x(Microsoft(R)Visual C#コンパイラバージョン2.4.0.62122(ab56a4a6)のように)はC#7.x以前を実装します。 VS2017に同梱されています。

わかりました、十分な背景。質問に戻ります。

Q1:具体的なプロジェクトを構築するためにVSを使用しているC#バージョン(コンパイラーではなく言語)を確認するにはどうすればよいですか?

回答:プロジェクト設定から、使用されている言語バージョンを簡単に確認できます。

Advanced settings

明示的なバージョンを選択しない場合は、プロジェクトのコンパイルでcsc.exeがサポートする最新バージョンを自動的に使用できます。

@Servyが@DaniloCataldoの回答の下でlangversionスイッチに関する詳細をコメントしていることに注意してください。そのスイッチには、設計上の目標と制限があります。したがって、たとえば、Roslyn 2.xコンパイラにC#4.0に基づいてプロジェクトをコンパイルさせたとしても、コンパイルされた結果はC#4.0コンパイラとは異なります。

Q2:C#コンパイラと言語バージョンの間に厳密で明確かつ透過的なリンクはありますか?

回答:上記の背景を参照してください。すでにこの部分に回答していると思います。厳密で明確で透明なリンクがあります。

Q3:Visual Studioに(あるStudioバージョンから別のバージョンへの移行の問題の場合)具体的なソリューションに異なるコンパイラバージョンを使用するように指示できますか?

回答:Q1に複製します。

20
Lex Li

前の答えに追加するだけです。 C#言語とC#コンパイラは.Net Frameworkとは別のものですが、それでも.NetFrameworkに依存していることに注意してください。

たとえば、C#5には待機/非同期言語機能がありますが、少なくともいくつかの追加のアクションとnugetパッケージがなければ、.Net4では使用できません。

一方、C#6のnameofまたはnull伝播機能は、純粋にコンパイラによって実装されているため、.Net4.0で引き続き使用できます。

3
SENya

これまで、Visual Studio 2005は、1つの.Netバージョンとこのバージョンで提供されるC#コンパイラにのみ修正されていました。新しいバージョンのVSを使用する場合は、VisualStudioも切り替える必要があります。 Visual Studioは、複数の.Netバージョンをターゲットにできるようになり、新しいC#コンパイラと古い.Netフレームワーク(.Net 2.0のラムダまたは拡張メソッド)を混在させることもできます。単純にC#コンパイラのバージョンはC#言語のバージョンに関連しています

プロジェクトファイルでコンパイラのバージョンを確認でき(xmlとして開きます)、Project要素のToolsVersion属性があります。

私の特定のプロジェクトにはToolsVersion = "4.0"があり、ターゲットプロジェクトは。Net 2.です。これは、VS2005では使用できない古いフレームワークで新しい言語構造を使用できることを意味します。

2
Aik