259

私は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の機能を使用できるという意味ですか?制限や欠点はありますか?


  • .NETバージョン2.0 - 3.5はCLR v2.0を使用します。新しいバージョンはCLR v4.0を使います。 - i3arnon
  • 覚えておいて、賢い最適化:あなたはこのように各猫のための別々のif-null-checkを追加している - Terence
  • 私の良さ「思い出させる」ために、v4.6をターゲットにしたWCFを開発しています。実運用サーバーは2018年までアップグレードされません。私は1ヶ月分の作業に数日のリファクタリングが必要になると思いました。 5分で終了しました。マイクロソフト、ありがとうございます。 :D - Eric Wu

5 답변


277

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

たとえば、C#6.0の以前のバージョンの.Netでは文字列補間機能を使用できますが、string.Format):

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

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

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

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


  • 実際には、.Net 4.6は必要ありません。追加されているのはほんの数種類です。あなたは自分で古いフレームワークにそれらを追加することができます。このコードは、.NET 4.0および3.5では正常に動作します。 - svick
  • .NET 4.0でどのC#6機能が機能するかを見るためのリストはどこかにありますか?これを尋ねるもう1つの方法は、フレームワークからのサポートを必要とする新機能、および追加されていない新機能です。 - Rubenisme
  • @Rubenisme他の人を考えることはできませんIFormattable文字列補間 - i3arnon
  • すべての構文上の糖を使用して、古いフレームワークバージョンをターゲットにできると言えると思います。と言っても大丈夫ですか? - mkb
  • @ mkbはい。シンタックスシュガーはまさにコンパイラの機能に依存しフレームワークの機能には依存しない機能です。 - i3arnon

50

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

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をターゲットにするために新しいコンパイラを利用するのに十分な柔軟性を開発者に与えます。


28

はい、古いフレームワーク用に新しいコンパイラを使用して、新しいコンパイラ機能にアクセスすることができます(それらの機能が.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で導入された属性を見つけることができます。


0

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

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


0

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

リンクされた質問


関連する質問

最近の質問