Итак ... это меня поставило в тупик. Я использую VS 2008 (C #).
У меня есть некоторый код, который бесконечно рекурсивен, но я не могу объяснить почему (ну, у меня есть предположение). Вы можете воспроизвести проблему, выполнив это:
- Создайте новый класс Form или UserControl. Добавить дочерний элемент управления (кнопка, метка, что угодно)
к этому.
Открыть файл кода. Переопределите свойство Font и сделайте так, чтобы оно возвращало и устанавливало дочерний элемент
свойство Font элемента управления, т. е.
class MyForm
{
public override Font Font
{
get { return childControl.Font; }
set { childControl.Font = value; } // not actually needed to reproduce
}
}
Вам нужен только получатель, чтобы вернуть свойство дочернего элемента управления, чтобы воспроизвести проблему. После следующей сборки не открывайте конструктор для вашей формы или UserControl, произойдет сбой VS.
Запустите вашу программу. Это потерпит крах из-за StackOverflow. Это происходит на
this.Controls.Add( childControl );
строка файла конструктора. Вызов Get () для свойства Font является рекурсивным.
Итак, кто-нибудь знает, почему возврат свойства дочернего элемента управления в переопределении вызывает переполнение стека при добавлении дочернего элемента в коллекцию Controls?