c# version




在C#6(Roslyn CTP6)中為字符串插值指定語言環境 (2)

使用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控制台項目。


你所擁有的應該工作。 這是正確的語法。 在“ System.FormattableString”抽像類上還有一個便捷的方法,其作用與建議的“ INV”幫助器方法相同。

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

我終於想通了。 事實證明,編譯器功能依賴於兩種類型, System.FormattableString System.Runtime.CompilerServices.FormattableStringFactory 。 這些不適用於我的項目-我猜他們可能尚未將其納入CTP6的所有平台中。

顯然,這使編譯器如描述的那樣掛起。 一旦從CoreCLR代碼中提取了這兩種類型的代碼並將其添加到我的項目中,我的代碼就會按預期工作。

這是通過 InterpolationTests 代碼註釋來確定的。 來源的萬歲:-)





string-interpolation