web-dev-qa-db-ja.com

C#6.0は.NET 4.0で動作しますか?

私はC#6.0を使ってサンプルプロジェクトを作成しました - 例としてnull伝播とプロパティの初期化、set target version .NET 4.0そしてそれはうまくいきます。

public class Cat
{
    public int TailLength { get; set; } = 4;

    public Cat Friend { get; set; }

    public string Mew() { return "Mew!"; }
}

class Program
{
    static void Main(string[] args)
    {
        var cat = new Cat {Friend = new Cat()};
        Console.WriteLine(cat?.Friend.Mew());
        Console.WriteLine(cat?.Friend?.Friend?.Mew() ?? "Null");
        Console.WriteLine(cat?.Friend?.Friend?.TailLength ?? 0);
    }
}

.NET 4.0をターゲットとするソフトウェアでC#6.0の機能を使用できるという意味ですか?制限や欠点はありますか?

268
MajesticRa

はい(ほとんど) C#6.0には新しいRoslynコンパイラが必要ですが、新しいコンパイラは古いフレームワークバージョンをターゲットにしてコンパイルできます。これは、フレームワークからのサポートを必要としない新しい機能に限られています。

たとえば、C#6.0の以前のバージョンの.Netで文字列補間機能を使用することはできますが(string.Formatの呼び出しになるため)、

int i = 3;
string s = $"{i}";

新しいフレームワークのバージョンでのみSystem.FormattableStringが追加されるため、IFormattableで使用するには.Net 4.6が必要です。

int i = 3;
IFormattable s = $"{i}";

あなたが言及したケースは動作するためにフレームワークからの型を必要としません。そのため、コンパイラは、古いフレームワークバージョンのこれらの機能を完全にサポートできます。

280
i3arnon

ウィキペディアや他のリンクを理解する方法に集中したいだけです。

C#6.0が.NET Framework 4.6に対応しているとWikipediaが言っている場合、それは単に製品版のコンパイラ(msc.exe)が.NET Framework 4.6リリースの一部になるということです。 マルチターゲティング を介して、このようなコンパイラは.NET Frameworkリリースの下位バージョンをサポートできます。もちろん、Roslynはオープンソースプロジェクトになったので、コンパイラは完全に個別のコンポーネントになりました。

CLRバージョンの4.0.30319(.0)を参照する場合は、.NET Framework 4 *(4.0、4.0。*、4.5、4.5。*、4.6、4.6。*)になります。 CLRバージョン4の仕様Xamarin/Monoも同じCLR仕様を実装していることは言うまでもありません。

MSDNページはまだ完全には更新されていませんが、 一部のページ には既に.NET Framework 4.6がバージョン情報の欄に記載されています。

全体として、言語仕様(およびC#コンパイラ)、CLR仕様、および.NET Frameworkリリースは、互いに密接に関連していません。それは、古いCLRと.NET Frameworkをターゲットにするために新しいコンパイラを利用するのに十分な柔軟性を開発者に与えます。

51
Lex Li

はい、古いフレームワーク用に新しいコンパイラを使用して、新しいコンパイラ機能にアクセスすることができます(それらの機能が.NET 4.6で導入された新しい型を必要としない限り)。

この他の例としては、C#4.0(.NET 4.0)で導入されたデフォルトパラメータのメソッドがありますが、.NET 2.0(C#2.0)および.NET 3.5(C#3.0)プロジェクトでそれらを使用できます。

また、.NET 2.0または.NET 3.0 で拡張メソッド(C#3.0で導入されたもの)を使用して、コンパイラーを幸せにするための小さな回避策 を1つ実行すれば、次のような属性を見つけることができます。 .NET 3.5で導入されました。

28

@oobeによる回答は実際に重要です。 C:\ Program Files(x86)\ MSBuild\14.0\BinMSBuild.exeを使用した後にのみ、バッチファイルを使用してソリューションを構築できました。 ).

1
Suryakant Soni

あなたがビルディングスクリプトを使用している場合は、新しいビルダーへのパスを変更することを忘れないでください。

CPATH = C:\ Program Files(x86)\ MSBuild\14.0\Binに設定します。

[Rebuild.bat]

set CPATH=C:\Program Files (x86)\MSBuild\14.0\Bin
call nuget_restore.bat
"%CPATH%\msbuild" YourSolution.sln /t:Rebuild /p:Configuration=Release /fileLogger /flp:logfile=JustErrors.log;errorsonly /verbosity:minimal

if %errorlevel% neq 0 goto ERROR

REM call deploy Release  //Things like deploy files..
goto END

:ERROR
       echo ERROR: %errorlevel%
       pause

:END
1
oobe