【问题标题】:What is the default culture for C# 6 string interpolation?C# 6 字符串插值的默认区域性是什么?
【发布时间】:2016-01-17 03:23:59
【问题描述】:

在 C# 6 中,新字符串插值的默认区域性是什么?

我看到关于不变文化和当前文化的相互矛盾的报道。

我想要一个明确的答案,我一直在为 Invariant 祈祷。

【问题讨论】:

  • 我投了反对票,因为这个问题没有显示任何研究工作。
  • 在发布这个问题之前我做了很多搜索,我找到了一些来源,包括说 Invariant 的 stackoverflow。我找到了其他来源,包括说明当前文化的 stackoverflow。这就是我问这个问题的原因。谢谢。
  • @AaronStainback 实际上在 SO 中有很多问题来自人们发现他们无法使用 InvariantCulture 进行插值。随意对说它使用 InvariantCulture 的人投反对票。在任何情况下,只需在单元测试中更改 Thread.CurrentCulture 就会显示这一点

标签: c# string-interpolation c#-6.0


【解决方案1】:

在 C# 中使用字符串插值被编译为对String.Format 的简单调用。您可以通过TryRolsyn 看到:

public void M()
{
    string name = "bar";
    string result = $"{name}";
}

编译成这样:

public void M()
{
    string arg = "bar";
    string text = string.Format("{0}", arg);
}

很明显,这不使用接受格式提供程序 hence it uses the current culture 的重载。

但是,您可以将插值编译为 FormattbleString,而不是将格式和参数分开,并在生成最终字符串时传递特定的文化:

FormattableString formattableString = $"{name}";
string result = formattableString.ToString(CultureInfo.InvariantCulture);

现在因为(如您所愿)使用 InvariantCulture 很常见,特别是有一个简写:

string result = FormattableString.Invariant($"{name}");

【讨论】:

  • 可能值得一提的是,FormattableString.Invariant 方法只能从 .Net Framework 4.6 开始使用。
  • 为了节省输入,您可以使用 C# 6.0 的 using static System.FormattableString;,因此您只需输入 String result = Invariant($"foo {bar} baz");
猜你喜欢
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
  • 1970-01-01
相关资源
最近更新 更多