2016-09-05 11 views
3

私は言語バージョンが「デフォルト」に設定されているビルド設定での.NET Framework 4.5ターゲットは.Net 4.5 VS2015ですが、C#6の機能を使用することはできますか?

を対象としたプロジェクトにVS2015で働いています

私が読んだとして

、C#6だけに追加されます私が読んだstring interpolation機能を使用するには、C#6の機能を使用することができます(少なくともコードはコンパイルされ、実行されます)。

は、今私は混乱しています:私は今C#6 /ネット4.6または.NET 4.5(?と私はそれをチェックすることができる方法)コメントで

EDIT

のために私が見ているのC#用にコンパイルしています6の構文は、.NET Frameworkのバージョンとは関係ありません。 私はこの回答(What are the correct version numbers for C#?)から、「.NET 4.6およびVS2015(2015年7月)でリリースされたC#6.0」というアイデアを得ました。 C#6が(何らかの形で).NETに結合されていることを理解しました。4.6

+3

C#6.0の構文はコンパイラによって解釈され、フレームワークとは何の関係もありません。 VS2015を使用している場合、そのコンパイラはタスク – Steve

+1

までです。これは文法的な砂糖です。コンパイル後、CLRは同じでなければなりません。 –

+0

@ user3185569私はその項目を読んだが、それは私の質問 – Michel

答えて

6

文字列補間などのC#6機能は、実行時(CLR)機能ではなくコンパイラの機能です。したがって、コンパイラがC#6をサポートしている限り、ビルド対象の.NETのバージョンに関係なく使用できます。

Visual Studio 2015では、対象言語のバージョンを制御できますProperties =>Build tab =>Advanced button =>Language Version

+0

だから、私は文字列補間を読み込んだときにC#6の機能は、それは本当ですか? – Michel

+0

@Michelそれは本当ですが、コンパイラはそれを 'String.Format'に変更するので、.NET 4.5で正常に動作します。 – user3185569

+0

コンパイラのバージョン。私が使っているバージョンを決めるのは何ですか?それは私が使用するVSのバージョンですか? – Michel

3

一般に、新しいバージョンの.NET Frameworkは、.NET Frameworkの新しいバージョンと同時にリリースされます。しかし、C#コンパイラは、使用しているフレームワークのバージョンに依存しません。代わりに、特定のタイプとメンバーが存在します。これらのタイプは新しいフレームワークに含まれていますが、他のタイプのフレームワークから取得することもできます。

たとえば、これは、the Microsoft.Bcl.Async packageを使用して、.Net 4.0でC#5.0 async - awaitを使用できる理由です。

特にC#6.0の場合、基本的な文字列補間は新しい型やメンバを必要としないため、新しいフレームワークのバージョンは必要ありません。このコード:.NET 4.5上だけで正常に動作し

string s = string.Format("pie is {0}", 3.14); 
Console.WriteLine(s); 

string s = $"pie is {3.14}"; 
Console.WriteLine(s); 

はにコンパイルします。

一方、文字列補間の高度な機能の1つは、補間された文字列をIFormattableまたはFormattableStringに変換できることです。たとえば、このコード:

IFormattable formattable = $"pie is {3.14}"; 
Console.WriteLine(formattable.ToString(null, CultureInfo.InvariantCulture)); 
Console.WriteLine(formattable.ToString(null, new CultureInfo("cs-CZ"))); 

がにコンパイル:

IFormattable formattable = FormattableStringFactory.Create("pie is {0}", 3.14); 
Console.WriteLine(formattable.ToString(null, CultureInfo.InvariantCulture)); 
Console.WriteLine(formattable.ToString(null, new CultureInfo("cs-CZ"))); 

これは純4.6に微細なコンパイルが、純4.5に失敗すると:

エラーCS0518:定義済みのタイプ'System.Runtime.CompilerServices。FormattableStringFactoryは、」定義されたか

をインポートしかし、あなたはそれが次のコードを含むことでコンパイルすることができません。もちろん

namespace System.Runtime.CompilerServices 
{ 
    class FormattableStringFactory 
    { 
     public static IFormattable Create(string format, params object[] args) => null; 
    } 
} 

、このダミーの実装で、次のコードは、NullReferenceExceptionをスローします。

実際にはthe unofficial StringInterpolationBridge packageを参照して動作させることができます。

関連する問題