【问题标题】:C# 4.0 Compiler CrashC# 4.0 编译器崩溃
【发布时间】:2023-03-03 10:08:01
【问题描述】:

This code sample 无法编译。有什么解决办法吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    using church = Func<dynamic, dynamic, dynamic>;

    class Program
    {
        static void Main(string[] args)
        {
            church True = (a, b) => a;
            church False = (a, b) => b;

            Func<church, church, church> And = (x, y) => x(y(True, False), False);
        }
    }
}

错误 6 内部编译器错误(地址 5476A4CC 处的 0xc0000005):可能的罪魁祸首是“EMITIL”。编译器发生内部错误。要解决此问题,请尝试在下列位置附近简化或更改程序。列表顶部的位置更接近发生内部错误的点。可以使用 /errorreport 选项将此类错误报告给 Microsoft。测试应用

【问题讨论】:

  • 它似乎是任何泛型,在 using 语句中包含“动态”以创建类型别名。

标签: c# compiler-construction crash


【解决方案1】:

显然这是一个编译器错误。

我向我们的一位测试人员提到了这一点,他说:

我很高兴地报告此问题已得到修复,您将在 VS 的下一版本中看到此修复。您实际上会在 Visual Studio 的 BUILD Developer Preview 中看到它已修复!

对错误深表歉意,并感谢您提醒我们注意这一点。

【讨论】:

  • 请注意我对 Jon Skeet 回答的评论:代表无关紧要; using crash = List&lt;dynamic&gt;; 也会崩溃。
  • @EricLippert VS 2012 v11.0.61030.00 Update 4 中仍然存在该错误
【解决方案2】:

我使用 VS2010 (WinXP 64) 重现了崩溃。

两种解决方法:

1。不要使用using 别名

以下代码在 VS2010 上编译干净:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<dynamic, dynamic, dynamic> True = (a, b) => a;
            Func<dynamic, dynamic, dynamic> False = (a, b) => b;

            Func<Func<dynamic, dynamic, dynamic>, 
                 Func<dynamic, dynamic, dynamic>,
                 Func<dynamic, dynamic, dynamic> > And 
                = (x, y) => x(y(True, False), False);
        }
    }
}

2。使用 Mono 编译器

Mono 2.10 编译器 (dmcs) 没有问题。

[mono] /tmp @ dmcs test.cs
test.cs(18,42): warning CS0219: The variable `And' is assigned but its value is never used
Compilation succeeded - 1 warning(s)
[mono] /tmp @ ./test.exe 
[mono] /tmp @ 

这是在 linux 上测试的。

  1. 您可以在 Windows .NET 上运行使用 mono 创建的二进制文件。
  2. Mono 编译器附带安装程序 MSI,也可以在 Windows 上运行。

【讨论】:

    【解决方案3】:

    编辑:我现在设法重现它,并且我有一个潜在的解决方法。

    这行得通:

    csc Test.cs
    

    这不是:

    csc /debug+ Test.cs
    

    所以看起来调试信息有问题。如果您可以在您的特定情况下没有它,那么您很高兴......

    编辑:我刚刚测试过,/debug:pdbonly 也会发生这种情况...

    编辑:以防万一有人想知道,我会就此联系 Eric Lippert。

    编辑:这是我现在找到的最小复制品:

    using church = System.Func<dynamic>;
    
    class Program
    {
        static void Main() {}
    }
    

    【讨论】:

    • 甜蜜的发现。您也可以不使用类型别名 (using)
    • 我怀疑问题在于 lambda 中的隐含属性无处可去,因为 lambda 并未实际使用;因此,下一个方法(在本例中为 Main())突然有一个不平衡的堆栈或类似的东西。当然,实际上并不了解编译器的内部结构,这简直是天方夜谭。
    • 另外,我们总是使用委托,但这无关紧要。 using crash = List&lt;dynamic&gt;; 也会崩溃。
    【解决方案4】:

    这是另一种解决方法:不要使用Func,而是使用良好的旧委托类型。

    public delegate dynamic Church(dynamic x, dynamic y);
    
    class Program {
        static void Main(string[] args) {
            Church True = (a, b) => a;
            Church False = (a, b) => b;
    
            Func<Church, Church, Church> And = (x, y) => x(y(True, False), False);
        }
    }
    

    这也有好处,Church 是随处定义的,而不仅仅是使用别名的每个文件。

    【讨论】:

    • “不要使用 Func,使用一个好的旧委托类型” 系列的其他成员)是委托...跨度>
    • @larsw:我的意思是使用非泛型委托类型。正如我在示例中所示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 2011-05-08
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多