嵌套的Linq Min()崩溃了Visual Studio

我有一段代码使Visual Studio 2008 IDE运行速度非常慢,消耗大量内存,最终导致崩溃。 我怀疑VS正在达到操作系统内存限制。

以下代码不是我真正的应用程序代码,但它模拟了问题。 基本上我试图使用LINQ在树中找到最小值。

class LinqTest { public class test { public int val; public List Tests; } private void CrashMe() { test t = new test(); //Uncomment this to cause the problem //var x = t.Tests.Min(c => c.Tests.Min(d => d.Tests.Min(e => e.Tests.Min(f=>f.Tests.Min(g=>g.Tests.Min(h => h.val)))))); } } 

还有其他人看过类似的东西吗?

前段时间我提交了一份关于MS Connect的错误报告 。 今天早上我收到了回复:

感谢Visual Studio 2008的错误报告!

正如你在Eric Lippert博客的链接post中指出的那样,我们限制了我们在合理的时间内对这种嵌套的lambda表达式进行类型推断的能力。 也就是说,我们当然可以尝试对这样的推断进行时间限制,或者对lambda嵌套设置一个硬限制来防止这种类型的问题。 不幸的是,我们开始锁定我们可以在Visual Studio 2010中修复的内容,并且我们将无法在此版本中强制执行此类限制。

在规划未来版本时,我们一定会记住这个问题!

亚历克斯特纳

项目经理

Visual C#编译器

您在Microsoft Connect上提交的以下反馈项已更新:产品/技术 – Visual Studio和.NET Framework – 反馈ID – 476133反馈标题 – 嵌套Linq Min()崩溃Visual Studio 2008 IDE以下字段或值已更改:字段状态从[有效]更改为[已解决]

字段分辨率从[无]更改为[无法修复]

我能够在我的Visual Studio 2008安装上重新编写它。 看起来语言服务正在无限循环并最终耗尽内存。 你能否在连接网站上提交一个错误?

连接: http : //connect.microsoft.com

如果您确实提交了错误,请在错误编号的回答中添加注释。

嵌套lambda表达式的类型推断需要指数时间 。 因此,当您进行太多嵌套时,编译器会变慢并不奇怪。

但是,理想情况下,IDE会处理此类情况并在中断时间过长时中止类型推断。

使用基本递归而不是试图“猜测”深度,增加每个级别的复杂性

 public static class TestExt { public static int Min(this Test test) { return Math.Min(test.val, test.Tests.Min(x => x.Min())); } } public class Test { public int val; public List Tests; } public class LinqTest { public void GetMin() { Test t = new Test(); var min = t.Min(); } } 

正如Ryan Versaw指出的那样,你也可以在没有扩展方法的情况下这样做:

 public class Test { public int val; public List Tests; public int Min() { return Math.Min(val,Tests.Min(x => x.Min())); } } 

你甚至不必走那么远。 在嵌套的LINQ表达式的d部分输入时,VS为我冻结了。

我想我会指出它也冻结了VS 2010,而且它几乎冻结了我的整个系统!

我想我刚刚经历过类似的事情。 我正在浏览我的代码并使用var on lines,我将变量声明并初始化为new SomeClass() 。 我编译的代码。 当我尝试运行任何Visual Studio 2008unit testing时,Visual Studio会因CLR20r3作为错误名称/类型而崩溃。 恢复我所有的var变化,测试运行正常。