web-dev-qa-db-ja.com

C#6での文字列補間のロケールの指定(Roslyn CTP6)

C#6の文字列補間により、次のように記述できます。

decimal m = 42.0m;
string x = $"The value is {m}";

ただし、文字列フォーマットの非常に一般的な使用例は、値のフォーマットに使用されるロケールを指定することです。上記のフォーマット操作にInvariantCultureを使用する必要があるとしましょう。その構文は何ですか?

この議論 は、私がこれを行うことができるはずであることを示唆しています:

string x = INV($"The value is {m}");

INVは次のように定義されます

public static string INV(IFormattable formattable)
{
    return formattable.ToString(null, System.Globalization.CultureInfo.InvariantCulture);
}

ただし、これは機能しません。コンパイルはされますが、起動時にcmd.exeでプログラムがハングしたままになります-klr.exeが起動されていると想定してハングするように(コンパイラのバグ?)

これは、VS15 CTP 6のASP.NET 5コンソールプロジェクトです。

56
driis

私はついにこれを理解しました。結局のところ、コンパイラー機能は2つのタイプに依存しています System.FormattableString 、および System.Runtime.CompilerServices.FormattableStringFactory 。これらは私のプロジェクトでは利用できませんでした-CTP6のすべてのプラットフォームにまだ入っていない可能性があると思います。

これにより、説明したようにコンパイラがハングしたようです。 CoreCLRコードからこれら2つのタイプのコードを取得し、プロジェクトに追加すると、コードは期待どおりに機能します。

これは、 InterpolationTests のコードコメントを通じて把握されました。利用可能なソースのHooray :-)

17
driis

あなたが持っているものが動作するはずです。正しい構文です。 「System.FormattableString」抽象クラスには、推奨される「INV」ヘルパーメソッドと同じ効果がある便利なメソッドもあります。

using static System.FormattableString;
...
string x = Invariant($"The value is {m}");
78
pharring