C# 为什么Roslyn在重写这个lambda时崩溃了?(Visual Studio 2015更新1)
我刚刚升级到VS2015.1,在尝试编译我的一个项目时遇到了编译器崩溃。如果将以下repo代码放入控制台应用程序(并添加对moq.dll的引用),第12行的代码会使我的编译器崩溃。这似乎发生在Roslyn lamdba重写电话中C# 为什么Roslyn在重写这个lambda时崩溃了?(Visual Studio 2015更新1),c#,lambda,crash,visual-studio-2015,roslyn,C#,Lambda,Crash,Visual Studio 2015,Roslyn,我刚刚升级到VS2015.1,在尝试编译我的一个项目时遇到了编译器崩溃。如果将以下repo代码放入控制台应用程序(并添加对moq.dll的引用),第12行的代码会使我的编译器崩溃。这似乎发生在Roslyn lamdba重写电话中 using System.Collections.Generic; using System.Linq; using Moq; namespace RoslynError { class Program { static void Main(strin
using System.Collections.Generic;
using System.Linq;
using Moq;
namespace RoslynError
{
class Program
{
static void Main(string[] args)
{
var mockRepo = new MockRepository(MockBehavior.Strict);
var obj = mockRepo.OneOf<DTO>(x => x.Value == (OptionEnum?)null);
}
}
class DTO
{
public DTO(OptionEnum? enumVal)
{
Value = enumVal;
}
public OptionEnum? Value;
}
enum OptionEnum
{
NotSpecified
}
}
使用System.Collections.Generic;
使用System.Linq;
使用最小起订量;
名称空间错误
{
班级计划
{
静态void Main(字符串[]参数)
{
var mockRepo=新的MockRepository(MockBehavior.Strict);
var obj=mockRepo.OneOf(x=>x.Value==(OptionEnum?)null);
}
}
类DTO
{
公共DTO(OptionEnum?enumVal)
{
值=枚举值;
}
公共期权价值;
}
最佳枚举
{
未指定
}
}
有人知道崩溃发生的原因吗?下面的简单示例也重现了这个问题,它与重写表达式树中的类型转换节点有关:
using System;
using System.Linq.Expressions;
namespace Bug461
{
class Program
{
enum Test { }
static void Main()
{
Expression<Func<Test?, bool>> x = t => t == (Test?)null;
}
}
}
使用系统;
使用System.Linq.Expressions;
名称空间Bug461
{
班级计划
{
枚举测试{}
静态void Main()
{
表达式x=t=>t==(测试?)null;
}
}
}
编辑:我稍微编辑了代码以避免出现警告
编辑2:该错误是由降级的枚举操作数(即空文本)没有关联类型引起的
编辑3:我提出了一个拉动请求,并提出了一个修复方案:对Moq的引用几乎不相关。我认为重要的是lambda箭头要转换为表达式树(类型为
expression
),而不是简单的委托实例(类型为Func
)。存在一个有效的警告,将不可为null的t
与null
进行比较。在问题的代码中,==
操作符的两边都已经可以为空(没有包装)。是的,但是当我在Visual Studio中本地编译它时,它仍然崩溃,虽然只安装了VS 2015 update 1。@SuneFoldager:因为您发出了无效代码:D请查看您的PR中的测试失败。PS:您还应该使用您的PR添加测试。@leppie:是的,我更新了PR。诀窍是在我们有显式可空类型转换的情况下不应用缩减。不幸的是,我们无法完全区分这些案例,我的公关似乎已经合并了。