构建错误:“表达式太长或太复杂,无法编译”

时间:2011-11-16 20:02:54

标签: c# visual-studio-2010 .net-4.0

每当我构建一个特定的解决方案时,我会在Error List窗口中随机获得一个“表达式太长或者很复杂”。但是,错误指向的唯一项是特定项目,而不是项目中的文件或特定的LOC。

当我遇到这个时,我'干净',然后我重启VS,这似乎解决了它。关于导致这种情况的任何想法?

此特定解决方案中包含50个项目。

11 个答案:

答案 0 :(得分:15)

仅供参考,该错误是编译器耗尽堆栈空间的特征。通常,当您在编译器中抛出“深度递归”问题时会发生这种情况,例如

int x = (1 + (1 + (1 + (1 + ......... + 1 ) + 1 ) + 1 ) + 1);
说,数千深。语法和语义分析器都是递归下降分析器,因此在极端情况下容易耗尽堆栈空间。

我不知道为什么关闭和重新开始会影响到这一点。这真的很奇怪。

如果你得到一个坚实的复制品,我很乐意看到它。要么在这里发布,要么在Connect上输入一个错误,我们会看看它。没有坚实的复制品,虽然很难说这里发生了什么。

答案 1 :(得分:4)

当我从Visual Studio 2012切换到Visual Studio Community 2013时,我在一个项目中出现此错误。 在我的情况下,它是巨型文件(25k行,不是我写的),由集合初始化程序初始化了List<string[]>

这样的事情:

public class Class
{

    public List<string[]> BigList
    {
        get
        {
            return new List<string[]>()
            {
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                .
                .
                .
                .
                .
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                new string[]{"foo","bar"}
            }
        }
    }
}

我将其更改为string[][],项目开始编译

public class Class
{

    public string[][] BigList
    {
        get
        {
            return new string[][]
            {
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                .
                .
                .
                .
                .
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                new string[]{"foo","bar"}
            }
        }
    }
}

答案 2 :(得分:2)

构建时,您可以看到构建输出它在失败之前检查的最后一个文件夹。我删除了该文件夹中的文件并逐个将它们带回来。终于找到了问题。我不确切知道它是什么,但它是一个包含大量HTML的.aspx页面。它经常使用,所以我只是从项目中删除它,现在它编译。<​​/ p>

enter image description here

enter image description here

答案 3 :(得分:1)

如果清洁和重建工作正常,那么代码显然不是问题。您应该向Microsoft报告,这似乎是一个VS错误。

答案 4 :(得分:0)

我从未在野外见过这种情况。

然而,从谷歌搜索它可能来自过多的汇编参考,一个特别的引用:

  

如果我将引用的程序集数量减少到5500,那么它就会被编译并正常工作

现在,当然,你会注意到一个很大的依赖列表,你能检查一下你是否引用了过多的程序集吗?

答案 5 :(得分:0)

我得到了这个错误导致非常大的svg文件。谷歌和一些个人实验后,我发现大svg文件的解决方案是:

@Html.Raw(File.ReadAllText(Server.MapPath("~/image.svg")))

在razor文件中有另一种方法使用html partial但不幸的是这个技巧不能用于大svg文件。

希望这有帮助..

答案 6 :(得分:0)

我在64位计算机上遇到了同样的问题(VS 2012)。

我使用@ MikeFlynn的答案来找到导致错误的文件夹。

最后我发现我有一个没有代码的Help.aspx页面 - 只是HTML 但它有多个图标图像作为基础64嵌入

<img src="data:image/png;base64 ... />

我将其转换为静态HTML并进行了编译。

P.S。同一个项目正在编制O.K.在32位VS2012机器中。 两台机器都运行Windows 7。

答案 7 :(得分:0)

我今天在Visual Studio 2019中遇到了这个问题。我的字符串很长

<img height="445" src="data:image/png;base64,iVBORw...

在我的file.aspx文件中。 vs2019中甚至较长的图像也可能导致此问题。

答案 8 :(得分:0)

我可以和我们分享这个错误的经验。典型的Microsoft杰作(或仅仅是一件杰作...)我们的问题实际上是由于IIS无法编译太多的DLL。诊断它很痛苦(因为不存在诊断方法)。从主BIN文件夹中删除一些不必要的DLL(例如单元测试DLL)已经解决了这个问题。走吧...

答案 9 :(得分:0)

当从 IDE 运行时,应用程序运行良好,在托管到 IIS 时,在尝试了基于图像和 base64 等给出的许多步骤后,出现了上述错误。以下发布 web.config 上的设置对我有用,较早的 debug = "true" 已设置,使其为 false,并且它起作用了。

<compilation debug="false" defaultLanguage="c#" maxBatchGeneratedFileSize="1000" maxBatchSize="1000" targetFramework="4.5">

答案 10 :(得分:0)

这周我遇到了同样的问题。它发生在电子邮件生成模块中。以前它运行良好,我有点失望。好的旧服务器重启修复了问题¯_(ツ)_/¯