Приведение типов аргументов в C#


Одна из важных особенностей определений методов в C# - это приведение типов аргументов. Под приведением здесь подразумевается преобразование аргумента в другой тип. Часто имеет место неявное преобразование: копия значения переменной преобразуется в другой тип без явного приведения. А вот явное преобразование имеет место тогда, когда на это указывает явное приведение.

Эти преобразования проводятся с помощью класса Convert из пространства имен System. В C# есть два вида преобразований:

  • Расширяющиеся. В этом случае идет преобразование без потери данных; чаще всего конечный тип позволяет удерживать большее количество данных.

  • Сужающиеся. Здесь после преобразования в значении переменной могут быть потеряны некоторые данные. Обычно идет такое приведение к типу, которой содержит меньший объем данных.
Ниже представлены две таблицы. В первой информация о размерах типов данных в 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, си шарп, типы данных




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Блог читающего программиста
Сигнализация на сайт
Вход по паролю на PHP и авторизация через куки