为什么IntPtr.ToInt32在64位模式下抛出OverflowException并且Explicit(IntPtr到Int32)不

时间:2012-06-25 15:38:22

标签: 64-bit clr intptr

运营商description on MSDN有一条评论:

  

如果value的值需要更多位,则仅抛出异常   比目前的平台支持。

虽然ToInt32's description没有,所以我认为标题不完全正确(为了简洁起见),

更正确的问题是:“为什么IntPtr.ToInt32以64位模式抛出OverflowException 适合Int32 和Explicit(IntPtr到Int32)的值不“

在反编译的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抛出异常,是不安全的关键字?

1 个答案:

答案 0 :(得分:10)

您的反汇编程序无法在此处正常工作,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
    }

checked 关键字提供了OverflowException。