8. Приведения типов.

Поскольку код C# является статически типизированным во время компиляции, после объявления переменной ее нельзя объявить повторно или использовать для хранения значений другого типа, если этот тип не преобразуется в тип переменной.

Тем не менее иногда может потребоваться скопировать значение в переменную или параметр метода другого типа. Например, может потребоваться передать целочисленную переменную в метод, параметр которого имеет тип double. Или может понадобиться присвоить переменную класса переменной типа интерфейса. Такого рода операции называются преобразованиями типа. В C# можно выполнять следующие виды преобразований.

  1. Неявные преобразования: никакой специальный синтаксис не требуется, поскольку преобразование является строго типизированным и данные не будут потеряны. Примеры включают преобразования из меньших в большие целочисленные типы и преобразования из производных классов в базовые классы.

  2. Явные преобразования (приведения): явные преобразования требуют оператора приведения. Приведение требуется, если в ходе преобразования данные могут быть утрачены или преобразование может завершиться сбоем по другим причинам. Типичными примерами являются числовое преобразование в тип с меньшей точностью или меньшим диапазоном и преобразование экземпляра базового класса в производный класс.

  3. Заданные пользователем преобразования: пользовательские преобразования выполняются специальными методами, которые можно определить для включения явных и неявных преобразований между пользовательскими типами, не имеющими отношения "базовый класс-производный класс".

  4. Преобразования с помощью вспомогательных классов: для выполнения преобразований несовместимых типов, таких как целые числа и объекты 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.

results matching ""

    No results matching ""