采用DateTimeOffset的表达式会导致Visual Studio内部编译器错误

Kar*_*sar 7 c# compiler-errors visual-studio roslyn visual-studio-2012

我试图模拟一个接口,它接受一个DateTimeOffset?参数.突然之间,Visual Studio开始报告"内部编译器错误"并且它已"停止工作".经过大量的试验,我开始逐个删除文件,然后逐行编码.这减少到下面的代码,它重现了这个错误:

public class testClass
{
    public interface ITest
    {
        void Test(DateTimeOffset? date);
    }

    public void test2()
    {
        var mock = new Mock<ITest>();
        mock.Setup(x => x.Test(new DateTime(2012, 1, 1)));
    }
}
Run Code Online (Sandbox Code Playgroud)

问题似乎是这样的:

mock.Setup(x => x.Test(new DateTime(2012, 1, 1)));
Run Code Online (Sandbox Code Playgroud)

如果我评论它,编译器工作正常.此外,问题是我正在设置一个new DateTime()适合的DateTimeOffset.

这是一个错误Moq,还是VS2012?以前有人遇到过这个错误吗?

UPDATE

以下代码示例也导致编译错误,包括常规Visual Studio 2012编译器和2012年9月Roslyn CTP:

using System;
using System.Linq.Expressions;

public interface ITest
{
    void Test(DateTimeOffset? date);
}

public class TestClass
{
    Expression<Action<ITest>> t = x => x.Test(new DateTime(2012, 1, 1));
}
Run Code Online (Sandbox Code Playgroud)

错误:

1> CSC:错误CS0583:内部编译器错误(地址00D77AFB处的0xc0000005):可能的罪魁祸首是"BIND".

此代码与Moq无关.

Eri*_*ert 7

这显然是语义分析器中的一个错误.(文本"可能是罪魁祸首是BIND"是语义分析器中的错误的特征,在内部称为"绑定器".)这里的场景是我们在lambda中有一个可升级到可空的用户定义转换.被转换为表达式树.那段代码是一个bug场.我以为我为这个确切的场景写了一个测试用例,但也许我没有.

无论如何,问题很可能是我的不好,对此感到抱歉.尽管如此,我现在无能为力.

真正奇怪的是,据称这个bug在Roslyn和C#5编译器上都有重复.这是一个疯狂的巧合,因为Roslyn和C#5编译器对于这部分语义分析有完全不同的代码.我们从头开始重写了大部分内容.奇怪的是,我们两次以同样的方式弄错了.

无论如何,凯文会看到这个,因为你把它标记为Roslyn,如果你想在Connect网站上输入一个bug,我相信团队会很感激.

更新:

等等,你在Roslyn 得到完全相同的错误?然后发生的事情可能是IDE仍在使用C#5分析库.如果您编写将违规代码加载到Roslyn编译中并对其进行分析的代码,则可能不会收到错误.对?


Han*_*ant 4

这令人印象深刻,像这样使 C# 编译器崩溃是非常罕见的壮举。您可以在 connect.microsoft.com 上报告该问题,尽管 Microsoft 应该从该网站收到大量 WER 报告。无论如何,我有几个:)

您可以通过重写代码来解决该问题。要么与:

static DateTimeOffset? arg = new DateTime(2012, 1, 1);
Expression<Action<ITest>> t = x => x.Test(arg);
Run Code Online (Sandbox Code Playgroud)

或者使用清洁剂:

public class TestClass
{ 
    Expression<Action<ITest>> t;

    public TestClass() {
        DateTimeOffset? arg = new DateTime(2012, 1, 1);
        t = x => x.Test(arg);
    }
}
Run Code Online (Sandbox Code Playgroud)