Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么Roslyn在重写这个lambda时崩溃了?(Visual Studio 2015更新1)_C#_Lambda_Crash_Visual Studio 2015_Roslyn - Fatal编程技术网

C# 为什么Roslyn在重写这个lambda时崩溃了?(Visual Studio 2015更新1)

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

我刚刚升级到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    
  }
}
使用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。诀窍是在我们有显式可空类型转换的情况下不应用缩减。不幸的是,我们无法完全区分这些案例,我的公关似乎已经合并了。