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


275

私はサンプルプロジェクトを作成しましたが、C#6.0の利点があります-例としてnullの伝播とプロパティの初期化を行い、ターゲットバージョン.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の機能を使用できるということですか?制限や欠点はありますか?


7
.Netバージョン2.0〜3.5はCLR v2.0を使用します。新しいバージョンはCLR v4.0を使用します。
i3arnon 2015年

覚えておいてください、賢明に最適化してください:このように各猫に個別のif-null-checkを追加しています
Terence

2
私の良さ。私は、実稼働サーバーが2018年までアップグレードされないことを「思い出させる」ために、v4.6をターゲットにしたWCFを開発してきました。1か月分の作業には数日間のリファクタリングが必要だと思いました。5分で終了しました。ありがとう、マイクロソフト!:D
Eric Wu

回答:


286

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

たとえば、以前のバージョンの.NetでC#6.0の文字列補間機能を使用できます(これにより、 string.Format)。

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

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

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

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


31
実際には、.Net 4.6は必要ありません。それに追加されている数種類のみです。それらを古いフレームワークに自分で追加できます。このコードは、.Net 4.0および3.5で正常に動作します。
2015年

10
NET 4.0で機能するC#6機能を確認するためのリストはどこにありますか?これを尋ねる別の方法は、フレームワークからのサポートが必要な新機能と不要な新機能です。
Rubenisme

1
@Rubenisme IFormattable文字列補間以外は考えられません。
i3arnon

2
すべての構文糖を使用して、古いバージョンのフレームワークをターゲットにできると言えるでしょう。言ってもいいですか?
mkb

4
@mkbはい。シンタックスシュガーは、コンパイラー機能にのみ依存し、フレームワーク機能には依存しない機能です。
i3arnon 2016年

52

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

ウィキペディアがC#6.0が.NET Framework 4.6に対応していると言っている場合、それは単にコンパイラー(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をターゲットにする十分な柔軟性を開発者に提供します。


29

はい、古いフレームワークに新しいコンパイラを使用して、新しいコンパイラ機能にアクセスできます(これらの機能が.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で導入)を使用して、.NET 3.5で導入された属性を見つけられるようにコンパイラーを満足させる小さな回避策1つ実行することもできます。


1

ビルドスクリプトを使用している場合は、パスを新しいビルダーに変更することを忘れないでください。

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による回答は実際には重要です。C:\ Program Files(x86)\ MSBuild \ 14.0 \ BinからMSBuild.exeを使用した後でのみ、バッチファイルを使用してソリューションをビルドできました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.