Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#4.0编译器崩溃_C#_Compiler Construction_Crash - Fatal编程技术网

C#4.0编译器崩溃

C#4.0编译器崩溃,c#,compiler-construction,crash,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[]

无法编译。有什么解决办法吗

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);
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
命名空间控制台应用程序1
{
使用church=Func;
班级计划
{
静态void Main(字符串[]参数)
{
真教堂=(a,b)=>a;
教堂假=(a,b)=>b;
Func和=(x,y)=>x(y(真,假),假);
}
}
}
错误6内部编译器错误(地址5476A4CC处的0xc0000005):可能的罪魁祸首是“emittel”。编译器中发生内部错误。要解决此问题,请尝试在下面列出的位置附近简化或更改程序。列表顶部的位置更靠近发生内部错误的点。可以使用/errorreport选项向Microsoft报告此类错误。测试应用


我使用VS2010(WinXP 64)复制了崩溃

两个变通办法:

1.不要使用别名使用

以下代码可在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);
        }
    }
}
这是在linux上测试的

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

  • 编辑:我现在已经设法复制了它,我有一个潜在的解决办法

    这项工作:

    csc Test.cs
    
    这并不是:

    csc /debug+ Test.cs
    
    所以看起来这是调试信息的问题。如果在你的特定场景中,你可以不使用它,那么你就可以继续

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

    编辑:万一有人想知道,我会打电话给埃里克·利珀特

    编辑:这是我发现的最小复制:

    using church = System.Func<dynamic>;
    
    class Program
    {
        static void Main() {}
    }
    
    使用church=System.Func;
    班级计划
    {
    静态void Main(){}
    }
    
    这里还有另一个解决方法:不要使用
    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);
        }
    }
    
    公共代表动态教堂(动态x、动态y);
    班级计划{
    静态void Main(字符串[]参数){
    真教堂=(a,b)=>a;
    教堂假=(a,b)=>b;
    Func和=(x,y)=>x(y(真,假),假);
    }
    }
    

    这也有好处,Church在任何地方都有定义,而不仅仅是使用alias的每个文件。

    显然这是一个编译器错误

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

    我很高兴地报告,这已经被修复,您将在下一版本的VS中看到此修复。您将在Visual Studio的BUILD Developer预览中看到此修复


    对此错误深表歉意,并感谢您提醒我们注意此问题。

    它似乎是任何在using语句中包含“dynamic”的泛型,用于创建类型别名。Sweet find。您也可以不使用类型别名(
    使用
    ),我怀疑问题在于lambda中的隐含属性没有任何地方可去,因为lambda没有实际使用;因此,下一个方法(在本例中为
    Main()
    )突然出现堆栈不平衡或类似情况。当然,实际上并不了解编译器的内部结构,这是一种暗中操作。此外,我们总是使用委托,但这并不重要<代码>使用崩溃=列表
    也会崩溃。请注意我对Jon Skeet回答的评论:代理是无关的<代码>使用崩溃=列表也将崩溃。@EricLippert该错误仍然存在于VS 2012 v11.0.61030.00更新4“不要使用Func,使用一个好的旧委托类型”@larsw:我的意思是使用非泛型委托类型。如我在示例中所示。
    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);
        }
    }