string.format中的转义大括号会丢失。 可能的C#错误?

我有这个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:D}}}" ,该格式旨在显示一个大括号,一个格式为十进制数字的数值和一个右大括号。 但是,格式项目实际上按以下方式解释:

  • 前两个花括号(“{{”)被转义并产生一个大括号。

  • 接下来的三个字符(“{0:”)被解释为格式项目的开始。

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

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

  • 显示的最终结果是文字字符串“{D}”。 不会显示要格式化的数字值。

  • 编写代码以避免误解大括号和格式化项目的一种方法是单独格式化大括号和格式化项目

    所以你应该使用它;

    string result = string.Format(@"{0}{1:G};{2:G}{3}", "{", "foo", "bar", "}");
    
    链接地址: http://www.djcxy.com/p/51483.html

    上一篇: Escaped curly brace in string.format gets lost. Possible C# bug?

    下一篇: Escape curly brackets around a template entry when using String.Format