C#6字符串插值的默认文化是什么?

Aar*_*ack 33 c# string-interpolation c#-6.0

在C#6中,新字符串插值的默认文化是什么?

我已经看到了关于Invariant和Current Culture的相互矛盾的报道.

我希望得到一个明确的答案,我会不停地指责Invariant.

i3a*_*non 49

在C#中使用字符串插值编译成一个简单的调用 String.Format.你可以用TryRolsyn看到这个:

public void M()
{
    string name = "bar";
    string result = $"{name}";
}
Run Code Online (Sandbox Code Playgroud)

编译成这样:

public void M()
{
    string arg = "bar";
    string text = string.Format("{0}", arg);
}
Run Code Online (Sandbox Code Playgroud)

很明显,这不会使用接受格式提供程序的重载,因此它使用当前文化.

但是,您可以编译插值FormattbleString,这样可以保持格式和参数分离,并在生成最终字符串时传递特定的文化:

FormattableString formattableString = $"{name}";
string result = formattableString.ToString(CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)

现在(因为你喜欢),特别使用InvariantCulture它是一种简写:

string result = FormattableString.Invariant($"{name}");
Run Code Online (Sandbox Code Playgroud)

  • 可能值得一提的是,[`FormattableString.Invariant`](https://msdn.microsoft.com/en-us/library/system.formattablestring.invariant(v = vs.110).aspx)方法仅适用于.Net Framework 4.6起. (16认同)
  • 为了节省打字,你可以使用C#6.0的`using static System.FormattableString;`所以你只需要键入`String result = Invariant($"foo {bar} baz");`. (6认同)