我试图模拟一个将 DateTimeOffset?
作为其参数之一的接口(interface)。突然之间,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)));
如果我评论它,编译器工作正常。此外,问题是我正在设置适合 DateTimeOffset
的 new DateTime()
。
这是 Moq
或 VS2012
中的错误吗?以前有人遇到过这个错误吗?
更新
以下代码示例也会导致编译错误,无论是使用常规 Visual Studio 2012 编译器还是使用 Roslyn CTP September 2012:
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 address 00D77AFB): likely culprit is 'BIND'.
此代码与 Moq 无关。
最佳答案
这显然是语义分析器中的错误。 (文本“likely culprit is BIND”是语义分析器中错误的特征,在内部称为“binder”。)这里的场景是我们在 lambda 中有一个提升到可空的用户定义转换,它是转换为表达式树。该代码是一个错误农场。我以为我为这个确切的场景写了一个测试用例,但也许我没有。
无论如何,问题很可能是我的错,对此深表歉意。不过,我现在对此无能为力。
但真正奇怪的是,据称该错误在 Roslyn 和 C# 5 编译器上都会重现。这是一个疯狂的巧合,因为 Roslyn 和 C# 5 编译器对于语义分析的这一部分有完全不同的代码。我们从头开始重写了大部分内容。奇怪的是我们会以同样的方式犯错两次。
无论如何,Kevin 会看到它,因为您将它标记为 Roslyn,如果您想在 Connect 网站上输入错误,我相信团队会很感激。
更新:
等等,您在 Roslyn 中遇到了完全相同的错误?那么发生的事情很可能是 IDE 仍在使用 C# 5 分析库。如果您编写代码将有问题的代码加载到 Roslyn 编译中并对其进行分析,您可能不会收到错误。对吧?
关于c# - 采用 DateTimeOffset 的表达式导致 Visual Studio 内部编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15902520/