5

MSDNでのオペレーターの説明には、次のようなコメントがあります。

例外は、valueの値が現在のプラットフォームでサポートされているよりも多くのビットを必要とする場合にのみスローされます。

ToInt32の説明はそうではないので、タイトルは完全に正しくないと思います(簡潔にするため)、

より正確な質問は次のようになります。「Int32に適合する値に対して64ビットモードでIntPtr.ToInt32スローし、Explicit(IntPtr to Int32)が適合しないのはなぜですか」OverflowException

逆コンパイルIntPtr ToInt32すると、演算子は非常によく似ています。

public static explicit operator int(IntPtr value)
{
  return (int) value.m_value;
}

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
public unsafe int ToInt32()
{
  return (int) this.m_value;
}

何がToInt32例外をスローするのだろうか、それは安全でないキーワードですか?

4

1 に答える 1

11

あなたの逆アセンブラーはここで適切な仕事をすることができません.mscorlib.dllは特別です. これは AnyCPU アセンブリではありません。Microsoft は、プロセッサ アーキテクチャに基づいて、さまざまなバージョンをビルドして出荷しています。Reference Sourceを使用することをお勧めします。元のソース コードが得られます。次のようになります。

    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
    public unsafe int ToInt32() {
        #if WIN32
            return (int)m_value;
        #else
            long l = (long)m_value;
            return checked((int)l);
        #endif
    }

OverflowException を提供するのは、checkedキーワードです。

于 2012-06-25T17:30:17.550 に答える