2014-01-07 3 views
1

У меня есть следующий код в методе, чтобы преобразовать любое количество, чтобы байт:Почему это бросает исключение OverflowException?

try { 
    return (byte) Convert.ChangeType(operand.RealValue, TypeCode.Byte); 
} 
catch (OverflowException) { 
    if (AllowArithmeticOverflow) { 
     unchecked { 
      decimal d = Convert.ToDecimal(operand.RealValue); 
      return (byte) d; 
     } 
    } 

    throw; 
} 

В этом коде operand.RealValue как ожидается, будет любое число. Для примера, с которым я тестирую, это sbyte со значением -13 (проверено с помощью отладчика). Я могу пройти через отладчик и перейти к строке return (byte) d; ... В этот момент выбрано OverflowException, несмотря на то, что он находится в блоке unchecked.

Итак ... Что дает?

Кроме того, если вы смотрите на мою реализацию и задаетесь вопросом, что, черт возьми, я делаю - это результат всей гимнастики, которую я пробовал до сих пор, чтобы не получить это исключение. Must сжатый ответ выигрывает :)

Примечание: Сообщение об исключении заключается в следующем:

System.OverflowException: Значение было либо слишком велик или слишком мал для байт без знака. ---> System.OverflowException: значение было либо слишком большим, либо слишком маленьким для UInt32.

+2

-13 слишком мал для байт без знака – SwDevMan81

+0

Да, очевидно, - но я хочу, чтобы это в любом случае, в основном только reinterpret_cast это ... – Xenoprimate

+0

@ SwDevMan81 побед! Не могу быть более кратким, чем это. – paqogomez

ответ

3

Очевидно, что нет способа интерпретировать -13 в качестве байта. По крайней мере, если вы не укажете какой-то дополнительный контекст. Возможно, вы хотите обработать -13 как символ без знака (значение от -128 до 127), а затем переинтерпретировать биты в качестве знакового символа (байта).

Если это то, что вы пытаетесь сделать, вы можете использовать класс BitConverter.

0

Исключение вызвано использованием Convert.ChangeType .. поэтому блок unchecked не может работать в различных обстоятельствах (и почему вы, без сомнения, публикуете этот вопрос).

Convert.ChangeType заканчивается звонком IConvertible.To<TypeHere>. Способ по System.SByteToByte, как это:

public static byte ToByte(sbyte value) { 
    if (value < 0) { 
     throw new OverflowException(Environment.GetResourceString("Overflow_Byte")); 
    } 

    return (byte)value; 
} 

Это явно бросает исключение .. поэтому почему unchecked бесполезно.

+0

Он сказал, что точка разрыва в обратном выражении попадает. Очевидно, что он прошел мимо конверсии. –

0

Ваш комментарий:

в основном только reinterpret_cast это ...

я заключаю, что вы хотите, чтобы преобразовать sbyte со значением -13 и интерпретировать это как byte.

Так просто брось:

sbyte s = -13; 
byte u = (byte)s; // u = 243 
+2

Вы можете сделать то же самое, просто нажав на 'sbyte', а затем на' byte'. Это был бы более четкий код. – Servy

+0

По какой-то причине я думал, что это испортит знак ... не закончится ли оно '+ 13'? – Andrew

+0

Попробуйте сами и убедитесь сами. Результат тот же. – Servy

Смежные вопросы