一般に、新しいバージョンの.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を参照して動作させることができます。
C#6.0の構文はコンパイラによって解釈され、フレームワークとは何の関係もありません。 VS2015を使用している場合、そのコンパイラはタスク – Steve
までです。これは文法的な砂糖です。コンパイル後、CLRは同じでなければなりません。 –
@ user3185569私はその項目を読んだが、それは私の質問 – Michel