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

时间:2016-06-12 10:57:43

标签: 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"; }
    }
}

预期输出:{foo;bar}

结果:{foo;bar

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

1 个答案:

答案 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", "}");