Тип Ошибка отливки и конструктор
-
01-10-2019 - |
Вопрос
У меня есть два класса
public class A
{
public A()
{
}
}
public class B:A
{
public B()
{
}
}
И это код в основном заключается в следующем
A oa = new B();
B ob = new A();
Здесь Line 1 компилирует успешно, пока строка 2 отображает ошибку опечатки. Почему это происходит. Что именно происходит, когда new B()
а также new A()
призывает?
Решение
Что именно происходит, когда вызывается новый B () и новый A ()?
new A()
Создает объект типаA
на куче и возвращает ссылку на него.new B()
Создает объект типаB
на куче и возвращает ссылку на него.
Здесь Line 1 компилирует успешно, пока строка 2 отображает ошибку опечатки. Почему это происходит.
С B
подклассы A
, это действительно для ссылки на тип A
обратиться к объекту типа выполнения B
. Отказ После всего, B
это просто «особый случай» A
.
Однако общение не правда, потому что не все A
S можно считать B
с. Хотя это строго исполняется C # 'S безопасно Тип-система, даже если нет «реальной» несовместимости, причины таких ограничений являются естественными. Представьте, например, что B
объявил недвижимость public int Foo {get; set;}
Отказ Как бы вы ожидали, что это будет вести себя:
B ob = new A();
ob.Foo = 5;
Это явно нелогично: настоящий Объект, который ссылается на ссылку, не имеет такой собственности. Следовательно, компилятор запрещает такие конструкции.
Теперь представьте, что вы изменили свой код в:
B b = (B)new A();
Здесь вы говорите компилятору, что объект создан, будет, в время выполнения, быть присвоенным для ссылки на тип B
. Отказ Это будет компитенно хорошо, но поскольку утверждение явно неверно, время выполнения InvalidCastException
будет брошено.
Суммируйте систему типа C # (если вы игнорируете dynamic
и несколько особых случаев) оба статический а также безопасно: Вы не сможете лечить конкретный экземпляр A
как будто это был тип B
.
Другие советы
Вы объявили переменную типа B
, а затем попытался присвоить значение типа A
к этому. Вы определили B
быть своего рода A
, но это не значит, что все A
есть B
.
Подумайте об этом, как это:
class Animal { }
class Dog : Animal { }
class Cat : Animal { }
Ты можешь сделать Animal rex = new Dog()
, потому что все собаки животные, но не Dog fido = new Animal()
, Потому что не все животные - собаки.