首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个getter会抛出StackOverflowException,但只在从一个项目调用时才会这样做?

为什么这个getter会抛出StackOverflowException,但只在从一个项目调用时才会这样做?
EN

Stack Overflow用户
提问于 2010-02-08 13:24:43
回答 1查看 882关注 0票数 3

我有几个项目:

  • 定义Thingo (主要解决方案)
  • 的数据库接口项目定义ThingoChooser (插件解决方案)
  • 的逻辑项目指逻辑项目(插件解决方案
  • 引用逻辑项目(插件解决方案)<代码>H 210<代码>F 211>

我正在调试插件,所以我运行主解决方案,将其当前工作目录设置为所有插件项目所针对的bin\Debug目录。主可执行文件在GUI程序集中查找插件类并显示其主要形式。

在测试项目中,这段代码运行良好:

代码语言:javascript
复制
this.chooser = new ThingoChooser();
foreach (var thingo in this.chooser.AvailableThingos) {
    Console.WriteLine(release);
}

发布到我的GUI项目中的相同代码在StackOverFlowException返回时会失败。

ThingoChooser.AvailableThingos看起来是这样的:

代码语言:javascript
复制
    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返回之前检查它。当我单击step按钮时:StackOverflowException,每次。调试器也会发生这种情况。

我试过的死鸡的细波,大部分是由评论者推荐的,包括:

查看loops

  • Changing的堆栈跟踪( AvailableThingosList<Thingo>

  • Removing var的返回类型),以防隐式键入填充了

  • ,使该属性的后备存储变量public,将其按下directly

  • Changing,将备份存储为List<T>

  • Removing LINQBridge,并重新定位到.NET 3.5

更改没有帮助,堆栈跟踪也没有显示任何循环。单击getter的}后的“步骤进入”按钮一次,就会得到异常警告浮点读取:

StackOverflowException是未处理的

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

当我切换到.NET 3.5并完全删除LINQBridge并将备份存储的类型更改为List<Thingo>并直接访问它时,这个bug是最引人注目的,只需从WinForms代码中尝试如下:

代码语言:javascript
复制
List<Thingo> thingos = this.chooser.availableThingos.ToList();

是的:在.ToList()上调用List<Thingo>可能会导致StackOverflowException崩溃。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-02-08 22:43:21

结果发现问题是引用上的复制本地设置

GUI项目对数据库界面项目的引用具有Copy True。它对逻辑项目的引用具有复制本地集False。我怀疑逻辑项目是从一个不同于GUI项目的DLL返回一个Thingo的枚举。

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

测试项目已将两个项目的副本本地设置为True。匹配有帮助,或者只是在当前工作目录或路径中只有一个数据库接口DLL的副本。

我很乐意接受最好的答案,描述为什么这会导致StackOverflowException。我非常喜欢DuplicateCopiesOfAssemblyYouDoofusException

作为参考,以下是引用的映射及其副本本地设置:

Main命令项目(在调试器下运行,从其bin\Debug目录动态加载GUI项目):

  • 与主可执行文件在同一个目录中具有数据库接口DLL。这是与目标下面的所有数据库接口在提示路径中引用的目录相同。

GUI项目(配置失败):

复制本地= True

  • ref→逻辑项目:复制本地= False

逻辑项目:

复制本地= False

  • ref→数据库项目

试验项目:

复制本地= True

  • ref→数据库项目:复制本地= True

平心而论,我直到五分钟前才在问题中描述解决方案的布局,所以我不能指望他们已经解决了这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2221825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档