Вопрос

У меня есть два класса

 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.

Однако общение не правда, потому что не все AS можно считать 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(), Потому что не все животные - собаки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top