【问题标题】:Expression that takes a DateTimeOffset causes Visual Studio Internal Compiler Error采用 DateTimeOffset 的表达式导致 Visual Studio 内部编译器错误
【发布时间】:2013-04-09 12:55:20
【问题描述】:

我试图模拟一个将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

这是MoqVS2012 中的错误吗?以前有人遇到过这个错误吗?

更新

以下代码示例也会导致编译错误,无论是使用常规 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:内部编译器错误(地址为 0xc0000005 00D77AFB):可能的罪魁祸首是“BIND”。

此代码与起订量无关。

【问题讨论】:

  • 运行时出现内部编译器错误?还是在编译时?
  • @WouterdeKort 当我尝试构建解决方案时。
  • 好的。我可以重现这个问题。这确实是一个奇怪的错误。拆分 DateTimeOffset 的定义和对模拟的分配不会导致编译错误。
  • @WouterdeKort 是的,这解决了问题 - 但实际上发现那条线是问题所在,真是令人头疼!你认为这是一个应该报告的 VS 错误吗?
  • 我已在推特上发布此链接并将其发送给 Eric Lippert。我希望他能看看。否则,您可以在 Microsoft Connect 上将其报告为错误。

标签: c# visual-studio visual-studio-2012 compiler-errors roslyn


【解决方案1】:

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

无论如何,问题很可能是我的问题,对此深表歉意。不过,我现在对此无能为力。

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

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

更新:

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

【讨论】:

  • 我对 Roslyn 也有同样的想法,所以我安装了最新的 Roslyn ctp,将代码复制到控制台应用程序(添加了静态主程序)并得到了同样的错误。
  • 埃里克,我很好奇你是否能解释这里报告的错误stackoverflow.com/questions/15750867/…
  • @WouterdeKort:等等,确切同样的错误? “可能的罪魁祸首是绑定”,也就是说?
  • 是的,同样的错误。这是否意味着我并没有真正使用 Roslyn 编译器?我创建了一个 Roslyn 控制台应用程序,Roslyn using 语句位于我的文件顶部。
  • 到目前为止,Roslyn CTP 只是库;它不会用 Roslyn 构建的 C# 编译器替换 C# 编译器,因为在 CTP 时,Roslyn 构建的编译器无法编译所有 C# 语句。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-08-01
    • 1970-01-01
    • 2017-09-11
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    相关资源
    最近更新 更多