Преобразовать объект в встроенный тип C ++
-
30-09-2019 - |
Вопрос
У меня есть следующий минимальный код:
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 ++ или там более тривиальное решение?
Решение
HMYA, вы пытаетесь набить 32-разрядную свинью в 31-битную пшажник. Этот код в итоге вызовет конверт :: toint32 (значение uint32), что выглядит так:
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 );
}
Не связан с StackOverflow