7

我试图模拟一个将 aDateTimeOffset?作为其参数之一的接口。突然之间,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)));
    }
}

问题似乎是行:

mock.Setup(x => x.Test(new DateTime(2012, 1, 1)));

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

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

更新

以下代码示例还会导致编译错误,无论是使用常规 Visual Studio 2012 编译器还是使用 Roslyn CTP 2012 年 9 月:

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));
}

错误:

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

此代码与起订量无关。

4

2 回答 2

7

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

无论如何,这个问题很可能是我的错,所以很抱歉。不过,我现在对此无能为力。

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

无论如何,Kevin 会看到这个,因为你将它标记为 Roslyn,如果你想在 Connect 网站上输入错误,我相信团队会很感激。

更新:

等等,你在 Roslyn 中遇到了完全相同的错误?那么发生的事情很可能是 IDE 仍在使用 C# 5 分析库。如果您编写的代码将有问题的代码加载到 Roslyn 编译中并对其进行分析,您可能不会收到错误。对?

于 2013-04-10T15:12:48.837 回答
4

这令人印象深刻,像这样使 C# 编译器崩溃是非常罕见的壮举。你可以在 connect.microsoft.com 上报告它,尽管微软应该从它那里收到一堆 WER 报告。反正我有几个:)

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

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

或使用清洁剂:

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

    public TestClass() {
        DateTimeOffset? arg = new DateTime(2012, 1, 1);
        t = x => x.Test(arg);
    }
}
于 2013-04-10T12:43:18.997 回答