8. Приведения типов.
Поскольку код C# является статически типизированным во время компиляции, после объявления переменной ее нельзя объявить повторно или использовать для хранения значений другого типа, если этот тип не преобразуется в тип переменной.
Тем не менее иногда может потребоваться скопировать значение в переменную или параметр метода другого типа. Например, может потребоваться передать целочисленную переменную в метод, параметр которого имеет тип double. Или может понадобиться присвоить переменную класса переменной типа интерфейса. Такого рода операции называются преобразованиями типа. В C# можно выполнять следующие виды преобразований.
Неявные преобразования: никакой специальный синтаксис не требуется, поскольку преобразование является строго типизированным и данные не будут потеряны. Примеры включают преобразования из меньших в большие целочисленные типы и преобразования из производных классов в базовые классы.
Явные преобразования (приведения): явные преобразования требуют оператора приведения. Приведение требуется, если в ходе преобразования данные могут быть утрачены или преобразование может завершиться сбоем по другим причинам. Типичными примерами являются числовое преобразование в тип с меньшей точностью или меньшим диапазоном и преобразование экземпляра базового класса в производный класс.
Заданные пользователем преобразования: пользовательские преобразования выполняются специальными методами, которые можно определить для включения явных и неявных преобразований между пользовательскими типами, не имеющими отношения "базовый класс-производный класс".
Преобразования с помощью вспомогательных классов: для выполнения преобразований несовместимых типов, таких как целые числа и объекты
DateTime
или шестнадцатеричные строки и массивы байтов, можно использовать классBitConverter
, классConvert
и методыParse
встроенных числовых типов, таких какInt32.Paste
.
Неявные преобразования
Для встроенных числовых типов неявное преобразование можно выполнить, если сохраняемое значение может уместиться в переменной без усечения или округления. Например, переменная типа long (8-байтное целое число) может хранить любое значение, которое может хранить переменная int (4 байта в 32-разрядных системах). В следующем примере компилятор неявно преобразует значение справа в тип long перед назначением его bigNum.
int num = 2147483647;
long bigNum = num;
Явные преобразования
Тем не менее если преобразование нельзя выполнить без риска потери данных, компилятор требует выполнения явного преобразования, которое называется приведением. Приведение — это способ явно указать компилятору, что необходимо выполнить преобразование и что вам известно, что может произойти потеря данных. Чтобы выполнить приведение, укажите тип, в который производится приведение, в круглых скобках перед преобразуемым значением или переменной. В следующей программе выполняется приведение типа double в int. Программа не будет компилироваться без приведения.
double x = 1234.7;
int a = (int)x;
Операторы преобразования
C# позволяет разработчикам объявлять операции преобразования классов или структур, делая тем самым возможным преобразование одних классов и структур в другие, а также в базовые типы или из них. Для задания преобразования используются операторы, называемые в соответствии с типом, к которому выполняется преобразование. Преобразуемый аргумент или результат преобразования (но не оба из них) должны принадлежать к содержащему типу.
class SampleClass
{
public static explicit operator SampleClass(int i)
{
SampleClass temp = new SampleClass();
// Конвертация из int в SampleClass
return temp;
}
}
- Преобразования, определенные как implicit, выполняются автоматически, если это требуется.
- Для выполнения преобразований, определенных как explicit, требуется вызов операции приведения.
- Все преобразования должны быть объявлены как static.