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

What is the default culture for C# 6 string interpolation?

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

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

我想要一个明确的答案,我会为不变量祈祷。

在 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 非常普遍,特别是有一个 shorthand:

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