Приведение типов
Одна из важнейших особенностей CLR —
безопасность типов
(type safety). Во время
выполнения программы среде CLR всегда известен тип объекта. Программист всегда
может точно определить тип объекта при помощи метода
GetType
. Поскольку это
невиртуальный метод, никакой тип не сможет сообщить о себе ложные сведения.
Например, тип
Employee
не может переопределить метод
GetType
, чтобы тот вернул
тип
SuperHero
.
При разработке программ часто прибегают к приведению объекта к другим типам.
CLR разрешает привести тип объекта к его собственному типу или любому из его
базовых типов. В каждом языке программирования приведение типов реализова-
но по-своему. Например, в C# нет специального синтаксиса для приведения типа
объекта к его базовому типу, поскольку такое приведение считается безопасным
125
Приведение.типов
неявным преобразованием. Однако для приведения типа к производному от него
типу разработчик на C# должен ввести операцию явного приведения типов — не-
явное преобразование приведет к ошибке. Следующий пример демонстрирует
приведение к базовому и производному типам:
// Этот тип неявно наследует от типа System.Object
internal class Employee {
...
}
public sealed class Program {
public static void Main() {
// Приведение типа не требуется, т. к. new возвращает объект Employee,
// а Object — это базовый тип для Employee.
Object o = new Employee();
// Приведение типа обязательно, т. к. Employee — производный от Object
// В других языках (таких как Visual Basic) компилятор не потребует
// явного приведения
Employee e = (Employee) o;
}
}
Этот пример показывает, что необходимо компилятору для компиляции кода.
Теперь посмотрим, что произойдет во время выполнения программы. CLR проверит
операции приведения, чтобы приведение типов осуществлялось либо к факти-
ческому типу объекта, либо к одному из его базовых типов. Например, следую-
щий код успешно компилируется, но в период выполнения выдает исключение
InvalidCastException
:
internal class Employee {
...
}
internal class Manager : Employee {
...
}
public sealed class Program {
public static void Main() {
// Создаем объект Manager и передаем его в PromoteEmployee
// Manager ЯВЛЯЕТСЯ производным от Employee,
// поэтому PromoteEmployee работает
Manager m = new Manager();
PromoteEmployee(m);
// Создаем объект DateTime и передаем его в PromoteEmployee
// DateTime НЕ ЯВЛЯЕТСЯ производным от Employee,
// поэтому PromoteEmployee выбрасывает
// исключение System.InvalidCastException
DateTime newYears = new DateTime(2013, 1, 1);
PromoteEmployee(newYears);
}
продолжение
126
Do'stlaringiz bilan baham: |