为什么Roslyn在尝试重写这个lambda时会崩溃?(Visual Studio 2015更新1)

Jes*_*sen 9 c# crash lambda roslyn visual-studio-2015

我刚刚升级到VS2015.1并且在尝试编译我的一个项目时遇到了编译器崩溃.如果您将以下repo代码放在控制台应用程序中(并添加对moq.dll的引用),则第12行中的代码会使我的编译器崩溃.这似乎发生在Roslyn lamdba重写调用期间.

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    
  }
}
Run Code Online (Sandbox Code Playgroud)

有谁知道崩溃发生的原因?

Sun*_*ger 9

以下更简单的示例还重现了该问题,该问题与表达式树中的重写类型转换节点有关:

using System;
using System.Linq.Expressions;

namespace Bug461
{
  class Program
  {
    enum Test { }

    static void Main()
    {
      Expression<Func<Test?, bool>> x = t => t == (Test?)null;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

编辑:我稍微编辑了代码以避免警告.

编辑2:该错误是由https://github.com/dotnet/roslyn/commit/5c602fc6引起的,其中降级的枚举操作数(即空文字)没有关联的类型.

编辑3:我提出了一个建议修复的拉取请求:https://github.com/dotnet/roslyn/pull/7227