Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Gosy_nepolnostyu_7v1.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
3.7 Mб
Скачать

Неявные преобразования

Для встроенных числовых типов неявное преобразование можно выполнить, когда сохраняемое значение может уместиться в переменной без отбрасывания дробной части или округления до ближайшего целого. Например, переменная типа long (8-байтное целое) может хранить любое значение, которое может хранить int (4 байта в 32-разрядном компьютере). В следующем примере компилятор неявно преобразует значение справа в тип long перед присвоением его типу bigNum.

C#

// Implicit conversion. num long can // hold any value an int can hold, and more! int num = 2147483647; long bigNum = num;

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

Derived d = new Derived(); Base b = d; // Always OK.

Явные преобразования

Однако если преобразование не может быть выполнено без риска потери данных, для компилятора требуется, чтобы пользователь выполнил явное преобразование, которое называется приведением. Приведение является способом явно указать компилятору, что нужно сделать преобразование, и что известно, что может быть потеря данных. Для выполнения приведения заключите тип, в который производится приведение, в скобки перед преобразуемым значением или переменной. Следующая программа выполняет приведение типа double к типу int. Без приведения эта программа скомпилирована не будет.

C#

class Test {    static void Main()    {        double x = 1234.7;        int a;        // Cast double to int.        a = (int)x;        System.Console.WriteLine(a);    } } // Output: 1234

Для ссылочных типов явное приведение необходимо, если нужно выполнить преобразование из базового типа в производный тип:

C#

// Create a new derived type. Giraffe g = new Giraffe(); // Implicit conversion to base type is safe. Animal a = g; // Explicit conversion is required to cast back // to derived type. Note: This will compile but will // throw an exception at run time if the right-side // object is not in fact a Giraffe. Giraffe g2 = (Giraffe) a;

Операция приведения между ссылочными типами не меняет тип времени выполнения базового объекта; меняется только тип значения, которое используется в качестве ссылки на этот объект.

Исключения преобразования типов во время выполнения

В некоторых преобразованиях ссылочного типа компилятор не может определить, допустимо ли приведение. Для операции приведения возможна корректная ошибка компилятора во время выполнения. Как показано в следующем примере, приведение типов, которое заканчивается с ошибкой во время выполнения, вызываетInvalidCastException.

C#

class Animal {    public void Eat() { Console.WriteLine("Eating."); }    public override string ToString()    {        return "I am an animal.";    } } class Reptile : Animal { } class Mammal : Animal { } class UnSafeCast {    static void Main()    {                    Test(new Mammal());        // Keep the console window open in debug mode.        System.Console.WriteLine("Press any key to exit.");        System.Console.ReadKey();    }    static void Test(Animal a)    {        // Cause InvalidCastException at run time        // because Mammal is not convertible to Reptile.        Reptile r = (Reptile)a;    } }

C# предоставляет операторы is и as, чтобы можно было проверить совместимость перед действительным выполнением приведения.

(http://cppstudio.com/post/310/, http://cppstudio.com/post/5343/, https://msdn.microsoft.com/ru-ru/library/ms173105.aspx)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]