在C#6中指定string插值的区域设置(Roslyn CTP6)
在C#6中的string插值让我写:
decimal m = 42.0m; string x = $"The value is {m}";
但是,string格式化的一个非常常见的用例是指定用于格式化值的区域设置。 假设我需要使用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”抽象类中也有一个方便的方法,它与build议的“INV”辅助方法具有相同的效果。
using static System.FormattableString; ... string x = Invariant($"The value is {m}");
我终于明白了这一点。 事实certificate,编译器function依赖于两种types, System.FormattableString
和System.Runtime.CompilerServices.FormattableStringFactory
。 这些对我的项目来说是不可用的 – 我想他们可能还没有将它用于CTP6的所有平台。
这显然使编译器挂起描述。 一旦我从CoreCLR代码中提取这两种types的代码,并将其添加到我的项目中,我的代码将按预期工作。
这是通过InterpolationTests的代码注释计算出来的。 万岁的来源可用:-)