Почему я должен явно окружать «unchecked»?

Кто-нибудь может объяснить мне это странное поведение?

    int i = 0x1234;
    byte b1 = (byte)i;
    byte b2 = (byte)0x1234;         //error: const value '4660' can't convert to byte (use unchecked)
    byte b3 = unchecked((byte)0x1234);
    byte b4 = checked((byte)i);     //throws
    byte b5 = (byte)(int)0x1234;    //error: same as above

ПРИМЕЧАНИЕ: это пустое консольное приложение с НЕТ арифметическая проверка включена (по умолчанию). Заранее всем спасибо.

РЕДАКТИРОВАТЬ: Я должен был быть достаточно ясным, но не для всех.

Я знаю, что слово может не умещается в байтах. Но по умолчанию программа на C # допускает определенные «опасные» операции, прежде всего из соображений производительности.

Точно так же я могу суммировать два больших целых числа и вообще не иметь переполнения.

Мои удивление было об ошибке времени компиляции выше: приведение / присваивание b1 скомпилировано, b2 не может скомпилироваться. По-видимому, нет никакой разницы, потому что оба Int32 имеют одинаковое значение.

Надеюсь, теперь все ясно.

10
задан Mario Vernari 19 October 2011 в 15:12
поделиться