C#. Объясните смысл преобразования данных [дубликат]

84
16 февраля 2022, 04:00
На этот вопрос уже даны ответы здесь:
Почему при сложении byte не переполняется? (2 ответа)
Закрыт 2 года назад.

Объясните пожалуйста как работает ключевое 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);
Answer 1

Я думаю вас обманул оператор '+' который возвращет 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.

Answer 2

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

Источник: https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/checked

READ ALSO
Как добавить значок сортировки на заголовок ListView используя MVVM

Как добавить значок сортировки на заголовок ListView используя MVVM

Примеров сортировки по столбцам ListView с отображением треугольника в какую сторону идёт сортировка, я нашёл достаточноНо они все подразумевают...

118
Visual Studio C# аналог #pragma mark из Xcode

Visual Studio C# аналог #pragma mark из Xcode

Есть подобный аналог в c#, а то падает читаемость кода при 999+ строк кода

103
Как отловить тап на смартфоне?

Как отловить тап на смартфоне?

Хочу реализовать прыжок по двойному нажатию в определенной областиКак считать первое и следующие нажатие по экрану чтобы проверить что...

107
Сборка и запуск WPF приложения из консоли

Сборка и запуск WPF приложения из консоли

Вопрос вроде простой, но я так не понял, как сделать: хочу сделать тоже самое, что делается при запуске/сборке приложения из visual studio, но только...

185