String.Format() 带有前导零的十六进制不适用于第二个参数

Ray*_*Ray 5 c# string.format

我面临着一个奇怪的问题String.Format()。我需要格式化两个带有前导零的十六进制数字以填充最多 8 位数字。但是,它仅适用于第一个参数 ( {0:X8})。对于第二个参数 ( {1:X8}),仅打印“X8”。

这是我的代码:

public struct DataDirectory
{
    public uint VirtualAddress
    {
        get;
        internal set;
    }

    public uint Size
    {
        get;
        internal set;
    }

    public override string ToString()
    {
        return String.Format("{{VirtualAddress=0x{0:X8},Size=0x{1:X8}}}", VirtualAddress, Size);
    }
}
Run Code Online (Sandbox Code Playgroud)

调试器输出打印以下内容:

调试器输出

编辑:如果我删除格式字符串开头和结尾处的大括号,它似乎可以工作,但随后我会丢失返回的字符串中的大括号ToString()(调试器仍将它们添加到 QuickWatch 窗口中):

return String.Format("VirtualAddress=0x{0:X8},Size=0x{1:X8}", VirtualAddress, Size);
Run Code Online (Sandbox Code Playgroud)

是否可以用 格式化两个十六进制数String.Format()

Jep*_*sen 5

小心所有这些右大括号}}}。您可以为其使用单独的格式项,如Size=0x{1:X8}{2}. 所以:

String.Format("{{VirtualAddress=0x{0:X8},Size=0x{1:X8}{2}", 
  VirtualAddress, Size, "}"
  )
Run Code Online (Sandbox Code Playgroud)

问题{1:X8}}}是不清楚哪个 double}}是转义的},哪个 single}正在关闭该项目。解析器实际上调用了Size.ToString("X8}")这不是您想要的。

现在你正朝着这个方向前进,也许可以这样做:

String.Format("{2}VirtualAddress=0x{0:X8},Size=0x{1:X8}{3}", 
  VirtualAddress, Size, "{", "}"
  )
Run Code Online (Sandbox Code Playgroud)