使用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无关。
这显然是语义分析器中的一个错误。(文本"可能的罪魁祸首是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);
}
}