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

フォーマットで要求されたときに、16 進フォーマットがIntPtr引数に直接適用されないのはなぜですか? 機能をそのように設計することに対する既知の議論はありますか?
そのような設計に対する反論がない場合、この問題をマイクロソフトに報告するには、どのチャネルを使用すればよいですか?


また、要求された場合、デバッガーはIntPtr値を 16 進数で表示することに注意してください。
これは非常に直感的で、IntPtr値を出力する比較的頻繁な方法であることがわかりました。また、最初の行を使用して 16 進数の結果を期待していた他の人によって書かれたコードを見つけましたが、実際には結果は異なっていました。また、ログ メッセージの理解を複雑にする問題に気付くまでに時間がかかりました。

4

2 に答える 2

7

String.Formatメソッドが引数に書式文字列を使用するには、引数がIFormattableインターフェイスを実装する必要があります。

IntPtrが を実装していないためIFormattable、メソッドはパラメーターなしのメソッドをString.Format呼び出して、値を文字列に変換します。ToStringIntPtr

于 2012-11-11T14:37:08.923 に答える
2

これは、最初のケースではIntPtr、String.Format で機能する組み込みの整数型の 1 つではなくptr.ToString()、文字列を返すために呼び出されるためです。書式設定は文字列への変換後にのみ適用されるため、X8 書式指定子は効果がありません。

于 2012-11-11T14:36:35.120 に答える