16

请注意,我不太确定这个问题是否属于这个网站,但我尽量保持建设性。

为什么代码

IntPtr ptr = new IntPtr(1234);
Console.WriteLine(string.Format("{0:X8}", ptr));
Console.WriteLine(ptr.ToString("X8"));
Console.WriteLine(string.Format("{0:X8}", ptr.ToInt32()));

输出

1234
000004D2
000004D2

IntPtr为什么在格式化时要求十六进制格式不直接应用于参数?是否有任何已知的反对设计功能的论据 - ?
如果没有反对这种设计的论据,那么我应该通过哪个渠道将此问题报告给 Microsoft?


另请注意,IntPtr如果需要,调试器会以十六进制显示值。
我发现这将是一种非常直观且相对频繁的打印IntPtr值的方式。我还发现其他使用第一行的人编写的代码显然期望十六进制结果,但实际上结果不同。我也花了一些时间注意到这个问题,这使得理解日志消息变得复杂。

4

2 回答 2

7

对于使用格式字符串作为参数的String.Format方法,参数必须实现IFormattable接口

由于IntPtr类型没有实现IFormattable,该String.Format方法只会调用无参数ToString方法将IntPtr值转换为字符串。

于 2012-11-11T14:37:08.923 回答
2

这是因为在第一种情况下,因为IntPtr不是与 String.Format 一起使用的内置整数类型之一,ptr.ToString()所以调用它以返回字符串。由于格式仅在转换为字符串后应用,因此 X8 格式说明符无效。

于 2012-11-11T14:36:35.120 回答