我有幾個項目:爲什麼這個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