string.format中的Escaped花括号会丢失.可能的C#bug?

Al *_*ndy 3 c# escaping string-formatting

我有这个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"; }
    }
}
Run Code Online (Sandbox Code Playgroud)

预期产量: {foo;bar}

结果: {foo;bar

将格式字符串更改为@"{{{0:G};{1:G} }}" [添加空格]会生成正确的输出.这是一个可能的错误或为什么没有显示逃脱的结束大括号?

Son*_*nül 6

来自Escaping Braces部分关于复合格式化 ;

打开和关闭括号被解释为开始和结束格式项.因此,您必须使用转义序列来显示文字左括号或右括号.在固定文本中指定两个开括号("{{")以显示一个左括号("{")或两个右括号("}}")以显示一个右括号("}").格式项中的大括号按其遇到的顺序依次解释.不支持解释嵌套大括号.

解释转义大括号的方式会导致意外结果.例如,考虑格式项"{{{0:D}}}",用于显示左大括号,格式为十进制数的数值和右大括号.但是,格式项实际上是按以下方式解释的:

  • 前两个开口支撑("{{")被转义并产生一个开口支撑.

  • 接下来的三个字符("{0:")被解释为格式项的开头.

  • 下一个字符("D")将被解释为十进制标准数字格式说明符,但接下来的两个转义大括号("}}")将产生一个大括号.由于结果字符串("D}")不是标准数字格式说明符,因此结果字符串将被解释为自定义格式字符串,这意味着显示文字字符串"D}".

  • 最后一个大括号("}")被解释为格式项的结尾.

  • 显示的最终结果是文字字符串"{D}".不显示要格式化的数值.

编写代码以避免误解转义的大括号和格式项的一种方法是分别格式化大括号和格式项.

所以你应该用它作为;

string result = string.Format(@"{0}{1:G};{2:G}{3}", "{", "foo", "bar", "}");
Run Code Online (Sandbox Code Playgroud)