我有几个项目:为什么这个getter抛出StackOverflowException,但只有从一个项目中调用时才会抛出StackOverflowException?
- 数据库界面项目定义
Thingo
(主溶液) - 逻辑项目定义
ThingoChooser
(插件溶液),其指的是逻辑项目 - 的GUI项目(
- 的测试项目,是指在逻辑项目(插件溶液)
我调试插件溶液插件,所以我运行主要解决方案,将其当前工作目录设置为由所有插件项目定位的bin\Debug
目录。主可执行程序在GUI程序集中查找插件类并显示其主窗体。
在测试项目中,该代码工作正常:
this.chooser = new ThingoChooser();
foreach (var thingo in this.chooser.AvailableThingos) {
Console.WriteLine(release);
}
相同的代码,贴到我的GUI项目,失败与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应用程序,当试图走List<T>
时抛出StackOverFlowException
。 :)
VS2008非常乐意让我在返回之前检查this.availableThingos
。当我每次单击步骤按钮时:StackOverflowException
。它也发生在调试器外面。
的死鸡我试过的细浪,最受评论者建议,包括:
- 望着for循环
- 改变的
AvailableThingos
返回类型的堆栈跟踪List<Thingo>
- 删除
var
如果隐式打字塞满了我 - 使财产的后盾存储变量
public
并直接打它 - 改变后备存储到
List<T>
- 删除LINQBridge和重新定位到.NET 3.5
的变化不帮忙,和堆栈跟踪不显示任何循环。之后,吸气的}
后的“进入”按钮的点击,我得到的异常警告浮式阅读:
StackOverflowException是未处理
类型的未处理的异常“系统。 StackOverflowException”出现在mscorlib.dll
bug是在其最引人注目的当我切换到.NET 3.5 和删除LINQBridge完全和后备存储的类型更改为List<Thingo>
和直接访问它和简单地从的WinForms代码试试这个:
List<Thingo> thingos = this.chooser.availableThingos.ToList();
没错:在List<Thingo>
调用.ToList()
可以StackOverflowException
炸毁。
什么是winform代码的样子?你确定堆栈溢出不是源于你对表单中的每个列表项所做的事情吗? – Paolo 2010-02-08 13:29:52
您可以将字段'availableThingos'公开 - 并使用'chooser.availableThingos' - 只是为了调试目的而删除该属性的调用? – tanascius 2010-02-08 13:31:00
来自你发布的帖子我会说它不是吸气剂,但创建SO的客户端代码和吸气剂恰好是堆栈中的最后一个方法,所以第一个问题是“什么其他方法多次在当你得到SO时堆叠?“如果您发布了一些可能有所帮助的堆栈跟踪和/或WinForm代码 – 2010-02-08 13:32:49