1

我有以下最少的代码:

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最后,我需要使用get_prop纯 C++ 代码中的结果。编写函数的正确方法是什么,get_prop以便在这两种情况下都能正常工作。我可以使用 C++ 中的某种模板还是更简单的解决方案?

4

1 回答 1

1

嗯,您正试图将 32 位猪塞进 31 位戳中。此代码最终调用 Convert::ToInt32(UInt32 value) ,如下所示:

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

卡布姆。不确定您想要哪种溢出行为,但这可以让编译器忽略并避免异常:

long get_prop( Object^ v )
{
    return (long)Convert::ToInt64( v );
}
于 2010-11-09T17:30:26.473 回答