У меня есть несколько проектов:
- Проект интерфейса базы данных, который определяет
Thingo
(основное решение)
- Логический проект, который определяет
ThingoChooser
(решение для плагина)
- Проект с графическим интерфейсом, который ссылается на логический проект (решение для плагина
- Тестовый проект, который ссылается на логический проект (плагин-решение)
Я отлаживаю плагин, поэтому запускаю основное решение с его текущим рабочим каталогом, установленным в каталог bin\Debug
, предназначенный для всех проектов плагина. Основной исполняемый файл находит класс плагина в сборке GUI и отображает его основную форму.
В тестовом проекте этот код работает нормально:
this.chooser = new ThingoChooser();
foreach (var thingo in this.chooser.AvailableThingos) {
Console.WriteLine(release);
}
Тот же код, опубликованный в моем проекте с графическим интерфейсом, завершается с ошибкой StackOverFlowException
, когда возвращается AvailableThingos
.
ThingoChooser.AvailableThingos
выглядит так:
public IEnumerable<Thingo> AvailableThingos {
get {
// Yes, it DEFINITELY case-matches the private variable,
// NOT the public property. Oh, I wish this were that easy!
return this.availableThingos;
}
private set {
// ...
}
}
… а на какой IEnumerable<Thingo>
мне установить this.availableThingos
?
Это List<Thingo>
.
Да, у меня есть приложение WinForms, которое выдает StackOverFlowException
при попытке пройти List<T>
. :)
VS2008 совершенно рад разрешить мне проверить this.availableThingos
до его возвращения. Когда я нажимаю кнопку шага: StackOverflowException
, каждый раз. Это также происходит вне отладчика.
Прекрасные волны мертвой курицы, которые я пробовал, большинство предложено комментаторами, включали:
- Просмотр трассировки стека для циклов
- Изменение типа возврата
AvailableThingos
на List<Thingo>
- Удаление
var
в случае, если неявная печать набивала меня
- Задание переменной резервного хранилища свойства
public
и прямое обращение к нему
- Изменение резервного хранилища на
List<T>
- Удаление LINQBridge и перенацеливание на .NET 3.5
Изменения не помогают, и трассировка стека не показывает никаких петель. После одного нажатия кнопки «Step Into» после }
метода получения я получаю всплывающее предупреждение с предупреждением об исключении:
Исключение StackOverflowException было обработано
Произошло необработанное исключение типа «System.StackOverflowException» в mscorlib.dll
Ошибка наиболее заметна, когда я переключаюсь на .NET 3.5 и , полностью удаляя LINQBridge и , меняя тип резервного хранилища на List<Thingo>
и прямой доступ к нему и просто попробуйте это из кода WinForms:
List<Thingo> thingos = this.chooser.availableThingos.ToList();
Да: вызов .ToList()
на List<Thingo>
может взорваться с StackOverflowException
.