在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.FormattableStringSystem.Runtime.CompilerServices.FormattableStringFactory 。 这些对我的项目来说是不可用的 – 我想他们可能还没有将它用于CTP6的所有平台。

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

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