Проблема действительно является одной из бесконечных рекурсий. Когда вы создаете объект MyClass
, он вызывает конструктор для этого класса. Поскольку MyClass
наследует от Form1
, и вы не указали конструктор по умолчанию (без параметров) для MyClass
, он неявно вызовет конструктор для Form1
.
Проблема в том, что у вас есть в коде для Form1
переменная уровня класса со значением по умолчанию. Когда класс имеет поле со значением по умолчанию, эти переменные будут неявно заданы с заданным значением в начале конструктора этого объекта. Так, например, код:
public class SomeClass
{
public int i = 5;
public SomeClass()
{
// Just a simple call and that's it
Console.WriteLine(i);
}
}
будет компилировать в нечто, напоминающее следующее:
public class SomeClass
{
public int i;
public SomeClass()
{
// Assign default values to class instance fields
i = 5;
// Execute the rest of the constructor code
Console.WriteLine(i);
}
}
Так вот проблема - ваш Form1
класс имеет MyClass
поле со значением по умолчанию new MyClass()
, Это поле будет назначено в конструкторе Form1
. Поскольку MyClass
наследует от Form1
, тогда будет вызван конструктор Form1
, который затем создаст новый экземпляр MyClass
, который снова вызовет конструктор для Form1
... Вы видите, как это превращается в бесконечную рекурсию? Конструкторы Form1
и MyClass
звонят друг другу взад и вперед навсегда и всегда (или, по крайней мере, до тех пор, пока программа не достигнет предела рекурсии и не выбросит исключение StackOverflowException).
Причина, по которой ваш код работает нормально, если вы удаляете значение по умолчанию и вместо этого помещаете его в отдельный метод, потому что этот метод не будет вызван дольше в вашей программе. Конструктор MyClass
вызовет конструктор Form1
, а затем вернется, что позволит вашей программе продолжить свой весёлый путь.
Какое исключение и какая линия увольняет его? – Abion47
System.StackOverflowException в строке с 'MyClass thing = new MyClass();' –
Это исключение распространено в случаях бесконечной рекурсии. Вы вызываете 'new MyClass()' внутри конструктора MyClass'? – Abion47