Данная тема как никакая другая чрезвычайно обширна, если рассматривать приведение типов в
ООП-программировании.
Здесь будет рассмотрено приведение целых типов чисел.
Например, возьмём вот такое выражение:
[code]
byte n = 250;
[/code]
Но если записать число, выходящее за пределы:
[code]
byte n = 270; //Тут будет ошибка
[/code]
Текст ошибки: Постоянное значение "270" не может быть преобразовано в "byte"
Дело в том, что 270 выходит за пределы допустимых значений byte (от 0 до 270). Вы можете это посмотреть в
таблице целочисленных типов.
Главное - чтобы от знака "=" числа были одного типа.
Либо тип слева от знака равенства был "больше по диапазону", чем тот, что справа от знака "равно".
Например, тут ошибки не будет:
[code]
short n = 270; //270 входит в диапазон short (-32768 до +32767)
[/code]
Приписав уменьшающий тип в скобках перед числом (byte)270 получим ограничение этого числа.
Рассмотрим ограничение, применимое к непосредственным числам. Например, вышеупомянутый пример: число 270.
[code]
byte n = (byte)270; //Получим число: 14
[/code]
Откуда 14? При приведении типов к byte мы будем получать число от 0 до 255. Это остаток от деления на 256. Для большего понимания пример:
[code]
(byte)253 - результат 253
(byte)254 - результат 254
(byte)255 - результат 255
(byte)256 - результат 0
(byte)257 - результат 1
(byte)258 - результат 2
(byte)259 - результат 3
(byte)260 - результат 4
...
(byte)510 - результат 254
(byte)511 - результат 255
(byte)512 - результат 0
(byte)513 - результат 1
[/code]
Какое число бы вы ни задали, оно будет в пределах от 0 до 255 при приведении к типу byte. И оно не будет обрезано именно до 255.
[code]
byte z = (byte)k; //Приводим число k типу byte
int b = (int)h; //Приводим число h типу b
[/code]
Приведение типов - это ограничение диапазона, в который входит это число.
Казалось бы, число 5 может входить в любой диапазон byte, sbyte, short, ushort, int, uint, long, ulong.
Однако вот это будет ошибкой:
[code]
long z = 5;
int m = z; //ошибка. long больше int. Необходимо long уменьшить до int
int m = (int)z; //вот так верно
[/code]
Далее. Это не ошибка:
[code]
byte n = 250;
int k = n; //Нет ошибки. Значение типа byte можно присвоить к int
[/code]
int больше byte, поэтому любое число byte входит в диапазон int, не вызывая ошибок
А вот так будет ошибка:
[code]
int n = 250;
byte k = n; //Ошибка. Значение типа int нельзя присвоить к byte
[/code]
Не каждое число int может войти в диапазон byte. Даже в данном случае, когда 250 входит и в byte и в int. Таковы уж правила C#.
Даже если мы, как люди, видим, что 250 можно присвоить к byte, компьютер "осторожничает" и предупреждает, что int нельзя приравнять к byte. Сначала ОГРАНИЧЬТЕ его диапазоны. Это и есть приведение типов. Следующий код ошибку не даст:
[code]
int n = 250;
byte k = (byte)n; //Получаем: 250, не вызвав исключение
[/code]
В общем получается так, что МЕНЬШИЙ тип можно присвоить к БОЛЬШЕМУ типу. Но не наоборот.
Рассмотрим ещё один случай:
[code]
int n = 1000;
long k = 1000000;
int z = k + n;
[/code]
На 3 строке вы получите предупреждение:
Неявное преобразование типа "long" в "int" невозможно. Существует явное преобразование (возможно, отсутствует приведение)
Здесь выходов 2.
1 вариант. Понизить диапазон k (long) до уровня int:
[code]
int n = 1000;
long k = 1000000;
int z = (int)k + n; //Привели k к типу int
[/code]
2 вариант. Повысить диапазон результата z до уровня long:
[code]
int n = 1000;
long k = 1000000;
long z = k + n; //Заменили 'int z' на 'long z'
[/code]
Дополнительная информация о том, как вывести результат в
консоли или
WinForm