在 C#6 (Roslyn CTP6) 中为字符串插值指定语言环境

Specifying locale for string interpolation in C#6 (Roslyn CTP6)

C#6 中的字符串插值让我写:

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

但是,字符串格式化的一个非常常见的用例是指定用于格式化值的语言环境。假设我需要使用 InvariantCulture 进行上面的格式化操作,它的语法是什么?

This discussion 建议我应该可以这样做:

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" 抽象 class 上还有一个方便的方法,它与建议的 "INV" 辅助方法具有相同的效果。

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

我终于明白了。事实证明,编译器功能依赖于两种类型,System.FormattableString, and System.Runtime.CompilerServices.FormattableStringFactory。这些不适用于我的项目 - 我猜他们可能还没有进入 CTP6 的所有平台。

这显然使编译器如所述那样挂起。一旦我从 CoreCLR 代码中提取了这两种类型的代码并将其添加到我的项目中,我的代码就按预期工作了。

这是通过 InterpolationTests 的代码注释发现的。来源可用万岁:-)