C# 指定C6中字符串插值的区域设置(Roslyn CTP6)

C# 指定C6中字符串插值的区域设置(Roslyn CTP6),c#,roslyn,c#-6.0,string-interpolation,C#,Roslyn,C# 6.0,String Interpolation,C6中的字符串插值允许我编写: decimal m = 42.0m; string x = $"The value is {m}"; 但是,字符串格式化的一个非常常见的用例是指定用于格式化值的区域设置。假设我需要在上面的格式化操作中使用不变量文化,它的语法是什么 建议我应该能够做到这一点: string x = INV($"The value is {m}"); 其中INV定义为 public static string INV(IFormattable formattable) {

C6中的字符串插值允许我编写:

decimal m = 42.0m;
string x = $"The value is {m}";
但是,字符串格式化的一个非常常见的用例是指定用于格式化值的区域设置。假设我需要在上面的格式化操作中使用不变量文化,它的语法是什么

建议我应该能够做到这一点:

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挂起编译器bug一样


这是VS15 CTP 6中的一个ASP.NET 5控制台项目。

您所拥有的应该可以工作。这是正确的语法。System.FormattableString抽象类上还有一个方便的方法,它与建议的INV helper方法具有相同的效果

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

我终于明白了。事实证明,编译器特性依赖于两种类型,和。我的项目中没有这些功能——我想它们可能还没有进入CTP6的所有平台

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


这是通过对的代码注释解决的。万岁!源可用:-

@KeithHill字符串插值的默认值为当前区域性非不变:@是的,谢谢。我后来注意到了这一点,但忘了回来更正我的评论。@Aaron:在这种情况下,你有没有解释为什么我会在VS2015:CA1305中遇到这个错误:C Framwork 4.6 Project,因为“string.Formatstring,object,object”的行为可能会因当前用户的区域设置而有所不同,将“函数”中的此调用替换为对“string.FormatFormatProvider,string,params object[]”的调用。如果“string.FormatFormatProvider,string,params object[]”的结果将显示给用户,请将“CultureInfo.CurrentCulture”指定为“FormatProvider”参数[…]@eFloh,这与使用未指定区域性信息的string.Format重载时会出现代码分析错误的原因相同。此代码分析规则的要点是强制您显式指定区域性信息,因为开发人员很容易忽略在需要时将其标记为不变量,或者错误地假设不变量是默认的cultureok,这是有意义的。在这种情况下,我们需要一种很酷的语法来指定插值字符串的区域性,比如$CultureInfo.CurrentCulturemy{interpolated}string或至少Current。。与现有库存一样,这些组件在哪里?我正在使用.net 4.5.2,我正在尝试引用它们,但我看不到它们可供引用。根据,它首次出现在4.6中。如果这对您不起作用,请仔细检查您是否拥有using static System.FormattableString-尽管上面明确写了它,但我还是设法错过了它: