C#4.0编译器崩溃

Mic*_*ray 50 c# compiler-construction crash

此代码示例无法编译.有什么工作吗?

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

错误6内部编译器错误(地址5476A4CC处的0xc0000005):可能的罪魁祸首是'EMITIL'.编译器中发生内部错误.若要解决此问题,请尝试简化或更改下面列出的位置附近的程序.列表顶部的位置更接近发生内部错误的位置.可以使用/ errorreport选项向Microsoft报告此类错误.TestApplication

Eri*_*ert 49

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

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

我很高兴地报告这已经修复了,你会在下一版本的VS中看到这个修复.您实际上也会在Visual Studio的BUILD Developer Preview中看到它!

为错误道歉,并感谢您引起我们的注意.

  • 请注意我对Jon Skeet的回答的评论:代表是无关紧要的; `使用crash = List <dynamic>;`也会崩溃. (2认同)

seh*_*ehe 27

我使用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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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 @ 
Run Code Online (Sandbox Code Playgroud)

这是在linux上测试的.

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


Jon*_*eet 21

编辑:我现在已经成功地复制它,我有一个潜在的解决方法.

这有效:

csc Test.cs
Run Code Online (Sandbox Code Playgroud)

这不是:

csc /debug+ Test.cs
Run Code Online (Sandbox Code Playgroud)

所以看起来这是调试信息的问题.如果你可以在你的特定场景中没有它,你很高兴去...

编辑:我刚刚测试过,这也发生在/debug:pdbonly......

编辑:以防万一有人想知道,我会对Eric Lippert这个问题.

编辑:这是我发现的最小的repro:

using church = System.Func<dynamic>;

class Program
{
    static void Main() {}
}
Run Code Online (Sandbox Code Playgroud)

  • 此外,我们总是使用代表,但这是无关紧要的.`使用crash = List <dynamic>;`也会崩溃. (3认同)

con*_*tor 14

这是另一种解决方法:不使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这也有好处,教会在任何地方定义,而不仅仅是使用别名的每个文件.