关于c#:在C#6中指定字符串插值的语言环境(Roslyn CTP6)

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

C 6中的字符串插值允许我写:

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

但是,字符串格式化的一个非常常见的用例是指定用于格式化值的区域设置。假设我需要在上面的格式化操作中使用InvariantCulture,它的语法是什么?

这次讨论表明我应该能够做到:

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

其中inv定义为

1
2
3
4
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"helper方法具有相同的效果。

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


我终于明白了。事实证明,编译器特性依赖于两种类型:System.FormattableStringSystem.Runtime.CompilerServices.FormattableStringFactory。我的项目没有这些功能——我想他们可能还没有进入CTP6的所有平台。

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

这是通过插入测试的代码注释计算出来的。正在提供源的hooray:-)