#c_sharp #исключения
Выдает исключение StackOverflowException при такой конструкции:
private void button1_Click(object sender, EventArgs e)
{
// Инициализация базового класса
var a = new A(); <<< тут исключение
}
private class A
{
public B b = new B();
public C c = new C();
}
private class B : A
{
}
private class C : A
{
}
Почему?
Ответы
Ответ 1
Для начала, в Вашем случае, объявление полей класса с их немедленной инициализацией private class A { public B b = new B(); public C c = new C(); } компилятор превращает в private class A { public B b; public C c; public A() { b = new B(); c = new C(); } } Т.е. если вы явно не создаете конструктор, то за Вас его создат компилятор и добавит туда инициализацию этих полей. Теперь давайте посмотрим что будет происходить при создании экземпляра класса A. При создании эземпляра вызывается конструктор по умолчанию, в котором инициализируется два поля b = new B() и c = new C(). B и C наследуются от A и, соответственно (т.к. Вы не указали конструктор для них) вызывается родительский контсруктор по умолчанию, в котором, опять же, инициализируются эти два поля (точнее скорее всего до инициализации c дело даже не дойдет, т.к. все свалится на инициализации b, но не уверен). Таким образом мы падаем в бесконечную инициализацию и получаем StackoverflowException
Комментариев нет:
Отправить комментарий