我有这个MSVC 2012 MCVE:
using System;
namespace ConsoleApplication1
{
internal class Program
{
private static void Main(string [] args)
{
string result = string.Format(@"{{{0:G};{1:G}}}", foo(), bar());
Console.WriteLine(result);
}
private static string foo() { return "foo"; }
private static string bar() { return "bar"; }
}
}
预期输出:{foo;bar}
结果:{foo;bar
将格式字符串更改为@"{{{0:G};{1:G} }}"
[添加空格]会产生正确的输出。这是一个可能的错误或为什么没有显示转义的结束大括号?
答案 0 :(得分:5)
来自Escaping Braces section on Composite Formatting;
打开和关闭括号被解释为开始和结束a 格式项。因此,您必须使用转义序列来显示 一个字面的开口支撑或关闭支撑。指定两个开口括号 (“{{”)在固定文本中显示一个左括号(“{”)或两个 关闭大括号(“}}”)以显示一个右大括号(“}”)。大括号 格式项按顺序依次解释 遇到。不支持解释嵌套大括号。
解析转义大括号的方式会导致意外结果。 例如,请考虑预期的格式项
"{{{0:D}}}"
显示左括号,一个格式为十进制的数值 数字和右括号。但是,格式项实际上是 按以下方式解释:
前两个开口大括号(“{{”)被转义并产生一个左大括号。
接下来的三个字符(“{0:”)被解释为格式项的开头。
下一个字符(“D”)将被解释为十进制标准数字格式说明符,但接下来的两个转义括号 (“}}”)产生一个支撑。因为结果字符串(“D}”)是 不是标准的数字格式说明符,结果字符串是 解释为自定义格式字符串,表示显示文字 字符串“D}”。
最后一个大括号(“}”)被解释为格式项的结尾。
显示的最终结果是文字字符串“{D}”。将不显示要格式化的数值。
编写代码的一种方法,以避免误解转义的大括号和 格式项目是分别格式化大括号和格式项。
所以你应该用它作为;
string result = string.Format(@"{0}{1:G};{2:G}{3}", "{", "foo", "bar", "}");