2016-01-18 18 views
5

私のコードに$"hello {person}"nameof(arg1)のようなものを使用していますが、プロジェクトのプロパティを調べるのに.NET 4.5をターゲットにしています。.VS 2015 NET 4.5の文字列補間と名前の使用

これは問題ありませんか?私はこれらのことが4.6で導入されたと思った。

私のマシンではプロジェクトが正常に構築され実行されますが、展開すると何かがうまくいかないと心配しています。

+0

Jon Skeetの[バージョンを解く](http://csharpindepth.com/Articles/Chapter1/Versions.aspx)を参照してください。それはC#6.0をカバーしませんが、概念は同じです。 – Habib

答えて

11

これはフレームワーク機能ではなく、コンパイラ機能です。我々が正常に一言で言えばVisual Studioの2015年

に私たちの.NET 3.5のプロジェクトとの両方の機能を使用すると、コンパイラはString.Format("hello {0}", person)から$"hello {person}""arg1"nameof(arg1)を変換します。それはただ構文的な砂糖です。

ランタイムはString.Formatコール(または文字列リテラル "arg1")を認識し、元のソースコードがどのように見えるかを知らない(または気にしません)。 String.Formatは、.NET Frameworkの初期段階からサポートされているため、以前のバージョンのフレームワークを対象にすることはできません。

+1

'FormattableString'の周りに少しのしわがあるのを私の答えで見てください。 –

1

これらはC#6で導入されました。 .Netはそれとは関係ありません。したがって、C#6コンパイラを使用している限り、これらの機能を使用できます。

What is the difference between C# and .NET?

そうです、それは、.NET 4.5をターゲットプロジェクトでそれらを使用すること大丈夫です。

8

これは.NETフレームワークコンポーネントのないC#6の機能です。

これは完全にnameofの真ですが、少しでも真の文字列補間です。

using System; 
using System.Globalization; 
using static System.FormattableString; 

class Test 
{ 
    static void Main() 
    { 
     CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR"); 
     double d = 0.5; 
     string local = $"{d}"; 
     string invariant = Invariant($"{d}"); 
     Console.WriteLine(local);  // 0,5 
     Console.WriteLine(invariant); // 0.5 
    }  
} 
:あなたは不変の書式設定をしたい場合に便利である、 FormattableStringに補間された文字列を変換も

文字列の補間は、ほとんどの場合、string.Formatを使用しますが、.NET 4.6を使用している場合、それはすることができます

は、単にstring.Formatへのコールを呼び出した場合は明らかにこれは動作しないだろう...その代わり、この場合には、それはlocalへの割り当て文でstring.Formatを呼び出し、invariantへの割り当て文でFormattableStringFactory.Createを呼び出し、上FormattableString.Invariantを呼び出します結果。以前のバージョンのフレームワークに対してこれをコンパイルしようとすると、FormattableStringは存在しないため、コンパイルされません。あなたが本当にしたい場合はFormattableStringFormattableStringFactoryの独自の実装を提供することができ、コンパイラはそれらを適切に使用します。

関連する問題