将Object转换为C ++内置类型

时间:2010-11-09 16:48:36

标签: c++-cli type-conversion integer-overflow

我有以下最小代码:

using namespace System;

long get_prop( Object^ v )
{
    return Convert::ToInt32( v );
}

int main()
{
    Object^ o1 = gcnew Int32( -1 );
    Object^ o2 = gcnew UInt32( 0xFFFFFFFF );
    long value1 = get_prop( o1 );
    long value2 = get_prop( o2 );

    return 0;
}

它在OverflowException函数中提供get_prop例外。最后,我需要在纯C ++代码中使用get_prop的结果。编写get_prop函数的正确方法是什么,以便在两种情况下都能正常工作。我可以使用C ++中的某种模板或更简单的解决方案吗?

1 个答案:

答案 0 :(得分:1)

Hmya,你正在尝试用31位戳来填充32位猪。此代码最终调用Convert :: ToInt32(UInt32值),如下所示:

public static int ToInt32(uint value)
{
    if (value > 0x7fffffff)
    {
        throw new OverflowException(Environment.GetResourceString("Overflow_Int32"));
    }
    return (int) value;
}

KABOOM。不确定你想要什么样的溢出行为,但是这让编译器可以忽略并避免异常:

long get_prop( Object^ v )
{
    return (long)Convert::ToInt64( v );
}