Кто-нибудь может объяснить мне это странное поведение?
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 имеют одинаковое значение.
Надеюсь, теперь все ясно.