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

本文关键字:Studio Visual 内部 编译 错误 DateTimeOffset 表达式 使用 | 更新日期: 2023-09-27 18:08:19

我试图模拟一个以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)));
    }
}

问题似乎是这句话:

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

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

这是一个bug在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: error CS0583: Internal Compiler error (0xc0000005 at address00D77AFB):可能的罪魁祸首是"BIND"。

这段代码与Moq无关。

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

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

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

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

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

更新:

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

令人印象深刻,像这样使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);
    }
}