c#-在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控制台项目。

driis asked 2019-11-08T04:45:06Z
2个解决方案
79 votes

你所拥有的应该工作。 这是正确的语法。 在“ System.FormattableString”抽象类上还有一个便捷的方法,其作用与建议的“ INV”帮助器方法相同。

using static System.FormattableString;
...
string x = Invariant($"The value is {m}");
pharring answered 2019-11-08T04:45:22Z
17 votes

我终于想通了。 事实证明,编译器功能依赖于System.Runtime.CompilerServices.FormattableStringFactorySystem.Runtime.CompilerServices.FormattableStringFactory这两种类型。我的项目无法使用这些功能-我想他们可能尚未将其纳入CTP6的所有平台中。

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

这是通过InterpolationTests的代码注释来确定的。 来源的万岁:-)

driis answered 2019-11-08T04:46:00Z
translate from https://stackoverflow.com:/questions/29333390/specifying-locale-for-string-interpolation-in-c6-roslyn-ctp6