Есть ли кто-нибудь, кто может объяснить мне это странное поведение?Почему я должен явно окружать «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
ПРИМЕЧАНИЕ: Это пустое консольное приложение, с NO арифметическая проверка включена (по умолчанию). Спасибо всем заранее.
EDIT: Я должен быть достаточно ясным, но не для всех.
Я знаю, что слово не может вписаться в байт. Но по умолчанию программа C# допускает определенные «опасные» операции, прежде всего по причине производительности.
Аналогично, я могу суммировать два больших целых числа и не иметь никакого переполнения.
Мое удивление было о ошибке времени компиляции выше: компиляция b1 cast/assign, b2 не может скомпилировать. По-видимому, нет никакой разницы, потому что оба типа Int32 имеют одинаковое значение.
Надеюсь, теперь это ясно.
Я не говорю C#, и я не знаю, что означает «checked» и «unchecked», но я знаю, что вы не можете вставить четырехзначный шестнадцатеричный номер в байте. –
Какое поведение «странно» для вас? Вы дали нам ** шаги для воспроизведения ** и ** фактического результата **, но не ** ожидаемого результата **. – AakashM