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

时间:2009-07-21 23:52:26

标签: c# visual-studio-2008 linq ide

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

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

class LinqTest
{
    public class test
    {
        public int val;
        public List<test> 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))))));
    }
}

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

7 个答案:

答案 0 :(得分:3)

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

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

如果您确实提交了错误,请在错误编号上添加评论。

答案 1 :(得分:3)

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

但是,理想情况下,IDE会处理此类情况,并且如果花费的时间太长,则会中止类型推断。

答案 2 :(得分:3)

前一段时间我提交了bug report on MS Connect。今天早上我收到了回复:

  

感谢Visual Studio 2008的错误报告!

     

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

     

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

     

Alex Turner

     

项目经理

     

Visual C#编译器

  

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

     

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

答案 3 :(得分:1)

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

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<Test> 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<Test> Tests;

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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