5

运营商在 MSDN 上的描述有一个备注:

仅当 value 的值需要比当前平台支持的更多位时才会引发异常。

whileToInt32的描述不是,所以我认为标题并不完全正确(为简洁起见),

一个更正确的问题是:“为什么在 64 位模式下IntPtr.ToInt32抛出适合 Int32和 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导致抛出异常,它是 unsafe 关键字吗?

4

1 回答 1

11

您的反汇编程序在这里无法正常工作,mscorlib.dll 很特殊。它不是 AnyCPU 组件,微软基于处理器架构构建并发布了不同版本的它。我建议您使用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 回答