2013-09-28 3 views
3

unchecked ключевое слово было объяснено в библиотеке MSDN как:Почему не проверено, не работает ли байт?

непроверенным ключевое слово используется для подавления переполнения проверки для арифметических операций интегрального типа и преобразования. В необработанном контексте , если выражение создает значение, которое находится за пределами диапазона типа назначения, переполнение не помечено.

По определению он хорошо работает на int типа.

Например:

unchecked 
{ 
    int i=2147483647+10; 
} 

Здесь он подавляет переполнение внутри непроверенной блока (должно быть)

Но когда мы применяем его на байт не работает

byte b1=100,b2=100,b3; 
unchecked 
{ 
    b3=b1+b2;//error here 
} 

. Поэтому все, что написано в неконтролируемой среде, должно быть подавлено.

Почему он дает ошибку времени компиляции?

Или я вообще не понимаю ключевое слово unchecked?

+5

'byte' вмещает до 255, так что это не переполнило бы все равно. Какова ваша «ошибка компилятора»? –

+2

не может неявно преобразовывать int в байт –

ответ

9

Вы неправильно поняли цель unchecked. Она имеет два эффекта:

  • Это предотвращает проверку переполнения во время выполнения
  • Это позволяет конвертировать постоянных значения, которые находятся за пределами нормального диапазона типа, в соответствии с вашим первым примером.

Это не изменить тип выражения. type of the expression b1 + b2 is still int, так что вам все равно нужен актер, чтобы преобразовать его в byte. Разница между checked и unchecked в этой ситуации является выполнением времени обработки переполнения при отливке int обратно byte:

byte b1 = 255, b2 = 1; 
unchecked 
{ 
    byte b3 = (byte) (b1 + b2); 
    // b3 is now 0 
} 

С проверила арифметику:

byte b1 = 255, b2 = 1; 
checked 
{ 
    byte b3 = (byte) (b1 + b2); // OverflowException 
} 
+1

Невозможно увидеть, как Джон Скит сэр дает ответ на мой вопрос, Тинкуу сэр –

4

Там нет + операции на байтах , Таким образом, b1 + b2 по-прежнему int.

Ваш код работает как;

byte b1 = 100, b2 = 100, b3; 
unchecked 
{ 
    b3 = (int)b1 + (int)b2; //error here 
} 

Если вы накладываете на byte решение, не будет никаких проблем;

byte b1 = 100, b2 = 100, b3; 
unchecked 
{ 
    b3 = (byte)(b1 + b2); //There is no error here. 
} 

Почему бесконтрольно не работает на байт?

Поскольку unchecked Ключевое слово используется для перелива-проверки для интегрального типа арифметики и Эрик Липперт says;

Различные размышления ниже - разумное приближение дизайна соображений. В более общем смысле: я не считаю байты «номерами»; I рассматривают их как шаблоны битов, которые могут быть интерпретированы как цифры или символы, или цвета или что-то еще. Если вы собираетесь делать , делая математику на них и рассматривая их как числа, тогда имеет смысл , чтобы переместить результат в тип данных, который чаще всего интерпретируется как номер.

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