Приведение типов аргументов в C#
Одна из важных особенностей определений методов в C# - это приведение типов аргументов. Под приведением здесь подразумевается преобразование аргумента в другой тип. Часто имеет место неявное преобразование: копия значения переменной преобразуется в другой тип без явного приведения. А вот явное преобразование имеет место тогда, когда на это указывает явное приведение.
Эти преобразования проводятся с помощью класса Convert из пространства имен System. В C# есть два вида преобразований:
- Расширяющиеся. В этом случае идет преобразование без потери данных; чаще всего конечный тип позволяет удерживать большее количество данных.
- Сужающиеся. Здесь после преобразования в значении переменной могут быть потеряны некоторые данные. Обычно идет такое приведение к типу, которой содержит меньший объем данных.
Таблица 1: Типы данных в C#
Тип | Размер в битах | Значения | Стандарт |
bool | 8 | true или false | |
char | 16 | От '\u0000' до '\uFFFF' | Набор символов Unicode |
byte | 8 | От 0 до 255 | Без знака |
sbyte | 8 | От -128 до +127 | |
short | 16 | От -32 768 до +32 767 | |
ushort | 16 | От 0 до 65 535 | Без знака |
int | 32 | От -2 147 483 до +2 147 483 647 | |
uint | 32 | От 0 до 4 294 967 295 | Без знака |
long | 64 | От -9 223 372 036 854 775 808 до +9 223 372 036 854 775 807 | |
ulong | 64 | От 0 до 18 446 744 073 709 551 615 | Без знака |
decimal | 128 | От 1,0*10-28 до 7,9*1028 | |
float | 32 | От ±1,5*10-45 до ±3,4*10-38 | Плавающая точка IEEE 754 |
double | 64 | От ±5,0*10-324 до ±1,7*10-308 | Плавающая точка IEEE 754 |
object | |||
string | Набор символов Unicode |
Таблица 2: Допустимые неявные преобразования
Тип | Может быть преобразован в тип |
bool | object |
byte | decimal, double, float, int, uint, long, ulong, short, ushort, object |
sbyte | decimal, double, float, int, uint, long, short, object |
char | decimal, double, float, int, uint, long, ulong, ushort, object |
decimal | object |
double | object |
float | double, object |
int | decimal, double, float, object |
uint | decimal, double, float, long, ulong, object |
long | decimal, double, float, object |
ulong | decimal, double, float, object |
short | decimal, double, float, int, long, object |
ushort | decimal, double, float, int, uint, long, ulong, ushort, object |
К примеру, программист может вызвать метод Cos класса Math с целым аргументом, несмотря на то, что требуется аргумент double. Оператор
Console.WriteLine(Math.Cos(3));
корректно оценит Math.Cos(3) и выведет результат. Здесь идет неявное преобразование int 3 в double 3.0 до того, как значение получает Math.Cos. Это один из примеров, когда C# неявно преобразовывает значения аргументов, которые точно не соответствуют типу параметра в определениях методов. Иногда преобразования такого типа могут вызвать ошибку компиляции: когда идет нарушение правил при определении расширяющегося преобразования.
В предыдущем примере C# с помощью Math.Cos преобразует int в double без непосредственного изменения аргумента, а вот обратное преобразование уберет мантиссу (дробную часть) у double. Если преобразовывать большие целые типы в меньшие (long в int), то в итоге могут получаться уже измененные значения. Эти сужающиеся преобразования могут приводить к потере данных, поэтому C# не позволяет их применять без явного приведения.
Правила преобразования C# применяют к выражениям смешанного типа (в которых содержатся значения двух или более типов данных) и к значениям примитивного типа данных, которые передаются в методы в качестве аргументов. C# изменяет типа значения в выражение смешанного типа до «самого высокого». Стоит отметить, что оригинал значения не меняется – создается специальная копия, которая и используется.
Таблицу 2 можно применять для определения самого высокого типа в выражении. Для типа в левом столбце правые – высшие. К примеру, типы decimal, double, float, int, long, object выше, чем тип short.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.