Преобразовать объект во встроенный тип C ++ - PullRequest
1 голос
/ 09 ноября 2010

У меня есть следующий минимальный код:

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 ++, или есть более тривиальное решение?

1 Ответ

1 голос
/ 09 ноября 2010

Хмя, вы пытаетесь засунуть 32-битную свинью в 31-битный удар.Этот код в конечном итоге вызывает 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 );
}
...