Страницы

Поиск по вопросам

четверг, 13 июня 2019 г.

Преобразование типов с#

Объясните почему возникает ошибка на этапе выполнения?
namespace CSharp { internal class B { } internal class D : B { } internal class Program { private static void Main() { Object o1 = new Object(); B b1 = new B(); D d6 = (D)b1; //System.InvalidCastException - не удалось привести тип объекта "CSharp.B" к типу "CSharp.D" B b5 = (B)o1; //System.InvalidCastException - не удалось привести тип объекта "CSharp.Object" к типу "CSharp.B" } } }


Ответ

Все просто, переменная b1 ссылается на объект типа B. Тип B в свою очередь является базовым для типа D, т.е. D является производным от B. Привести объект базового типа к более производному нельзя.
D d6 = (D)b1;
Аналогичная проблема и с этой строчкой
B b5 = (B)o1;
P.S. Небольшое замечание, если мы напишем следующий код:
B b = new D(); D d = (D)b;
и попробуем его выполнить, ошибки не будет. Здесь важно понимать следующее, что несмотря на то, что переменная b у нас типа B, она ссылается на объект типа D, поэтому приведение к типу D сработает. Т.е. строчка ниже выполнится без проблем.
D d = (D)b; // все ОК

Комментариев нет:

Отправить комментарий