Объясните пожалуйста как работает ключевое checked в данном примере, в 1-ом просто выйдет 0 в консоли из-за переполнения, во втором же программа и вовсе не запустится. Но понять логику почему в первом примере она запускается, а во втором происходит System.OverflowException не могу.
1)
byte x = byte.MaxValue;
byte z = (byte) checked(x + 1);
Console.WriteLine(z);
2)
byte x = byte.MaxValue;
byte z = checked((byte) (x + 1));
Console.WriteLine(z);
Я думаю вас обманул оператор '+' который возвращет int, в данном случае. В следствии чего в первом варианте вы просто не верно используете оператор checked.
Разберем эту строку
1. byte z = (byte) checked(x + 1);
Вот какую последовательность выполнит компилятор.
2. int tempVariable = checked(x + 1);
3. byte z = (byte) tempVariable
В строке 2. нету переполнения так как результатом будет int. В строке 3. вполне легальный кастинг к byte
Почему же 'x + 1' возвращает int? Если коротко то он просто так работает. Этот оператор перегружен для int и нету для byte. Потому даже такой код будет вам говорить об ошибке:
byte a = 2;
byte b = 1;
byte c = a + c;
И требовать что бы 'c' было int.
Ключевое слово checked используется для явного включения проверки переполнения при выполнении арифметических операций и преобразований с данными целого типа. То есть во время выполнения вашего кода будет создано исключение.
Источник: https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/checked
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости