代码之家  ›  专栏  ›  技术社区  ›  Garth Kidd

为什么这个getter抛出StackOverflowException,但仅当从一个项目调用时才抛出?

  •  3
  • Garth Kidd  · 技术社区  · 15 年前

    我有几个项目:

    • 定义 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应用程序 StackOverflowException(堆栈溢出异常) 当试图行走时 List<T> . :)

    VS2008非常乐意让我检查 这个。有货吗? 在它回来之前。当我单击步骤按钮时: StackOverflowException ,每次。它也发生在调试器之外。

    我试过的死鸡的细浪,大多数评论建议包括:

    • 查看堆栈跟踪中的循环
    • 更改的返回类型 可用的Thingos 列出<thingo>
    • 去除 var 以防暗中打字把我塞住
    • 使属性的后备存储变量 public 直接击中它
    • 将备份存储更改为 列表& T;
    • 删除LinqBridge并重新定位到.NET 3.5

    更改没有帮助,堆栈跟踪也没有显示任何循环。单击“单步执行”按钮后, } 在getter中,我得到异常警告float over reading:

    StackOverflowException未处理

    mscorlib.dll中发生“System.StackOverflowException”类型的未处理异常。

    当我切换到.NET 3.5时,这个错误是最引人注目的。 完全移除LinqBridge 将备份存储的类型更改为 列出<thingo> 直接访问 只需从winforms代码中尝试:

    List<Thingo> thingos = this.chooser.availableThingos.ToList();
    

    是的:呼叫 .ToList() 在A上 列出<thingo> 会爆炸的 栈溢出异常 .

    1 回复  |  直到 15 年前
        1
  •  0
  •   Garth Kidd    15 年前

    问题出在 复制本地设置 关于参考文献。

    GUI项目对数据库接口项目的引用具有复制本地集 True . 它对逻辑项目的引用具有复制本地集 False . 我怀疑逻辑项目返回的是 Thingo 从与GUI项目所看到的不同的DLL。

    (可能是发生问题所必需的:在调试时,我正在运行第五个项目,该项目为GUI项目动态加载DLL。第五个项目有自己的数据库接口项目dll副本。)

    测试项目的两个项目集的副本都是本地的 . 匹配有帮助,或者只是因为当前工作目录或路径上只有一个数据库接口dll副本。

    我很乐意接受最好的回答 为什么 这导致了 StackOverflowException . 我宁愿选择 DuplicateCopiesOfAssemblyYouDoofusException .

    以下是参考地图及其副本本地设置,以供参考:

    主命令项目(在调试器下运行,从其 bin\Debug 目录):

    • 数据库接口dll与主可执行文件位于同一目录中。这与目标下提示路径中所有数据库接口引用的目录相同。

    GUI项目(配置失败):

    • 数据库项目:复制本地=
    • 参考逻辑项目:复制本地=

    逻辑项目:

    • 数据库项目:复制本地= 错误

    测试项目:

    • 参考逻辑项目:复制本地=
    • 数据库项目:复制本地=

    公平地说,我直到五分钟前才描述问题的解决方案布局,所以我不能指望他们已经解决了问题。