6

IntPtr.Zeroをdefault(IntPtr)と比較できないという難しい方法を学びました。誰かが理由を教えてもらえますか?

IntPtr.Zero == new IntPtr(0) -> "could not evaluate expression"
IntPtr.Zero == default(IntPtr) --> "could not evaluate expression"
IntPtr.Zero == (IntPtr)0 -> "could not evaluate expression"

IntPtr.Zero.Equals(IntPtr.Zero) --> "Enum value was out of legal range" exception
IntPtr.Zero.Equals(default(IntPtr)) --> "Enum value was out of legal range" exception

IntPtr.Zero == IntPtr.Zero --> true
new IntPtr(0) == new IntPtr(0) --> true
4

1 に答える 1

2

VS 2010、VS 2008、VS 2005 SP1、Mono1.2.6のコンパイル済みコードで動作します。Visual Studio 2005のウォッチウィンドウでのみ両方の問題を再現することができました(VS 2005 SP1で試しました)。コンパイルされたコードは期待どおりに機能します。(両方の問題で、問題1:「式を評価できませんでした」、問題2:「列挙値が有効な範囲外でした」を意味します。)したがって、コメント作成者の一部が指摘したように、これはVS2005ウォッチウィンドウです。あなたがつまずいたバグ。関連するバグレポートへのリンクをすばやく見つけるのは驚くほど難しいです...

そうでなければ、そのような場合、私はあなたが比較しようとしているタイプを確認するためにリフレクションから始めます(Console.Outをあなたがアクセスできる意味のあるストリームに置き換えてください):

Console.WriteLine("new IntPtr(0) type is: " + new IntPtr(0).GetType());
Console.WriteLine("IntPtr.Zero type is: " + IntPtr.Zero.GetType());
于 2012-06-24T11:14:49.267 に答える