C# lambda表达式中的枚举编译方式不同;过载分辨率改进的后果?

C# lambda表达式中的枚举编译方式不同;过载分辨率改进的后果?,c#,lambda,enums,roslyn,c#-6.0,C#,Lambda,Enums,Roslyn,C# 6.0,在试用Visual Studio 2015 RC时,我收到了一个关于以前工作代码的运行时错误。给定lambda(x=>x.CustomerStatusID==CustomerStatuses.Active)(作为表达式传递给函数),调试器显示表达式树中的差异。以前的汇编如下: .Lambda #Lambda1<System.Func`2[Services.DataClasses.CustomerDC,System.Boolean]>(Services.DataClasses.Cust

在试用Visual Studio 2015 RC时,我收到了一个关于以前工作代码的运行时错误。给定lambda
(x=>x.CustomerStatusID==CustomerStatuses.Active)
(作为
表达式
传递给函数),调试器显示表达式树中的差异。以前的汇编如下:

.Lambda #Lambda1<System.Func`2[Services.DataClasses.CustomerDC,System.Boolean]>(Services.DataClasses.CustomerDC $x)
{
    (System.Int32)$x.CustomerStatusID == 0
}
.Lambda#Lambda1(Services.DataClasses.CustomerDC$x)
{
(System.Int32)$x.CustomerStatusID==0
}
但在C#6.0中,它现在编译为

.Lambda #Lambda1<System.Func`2[Services.DataClasses.CustomerDC,System.Boolean]>(Services.DataClasses.CustomerDC $x)
{
    (System.Int32)$x.CustomerStatusID == (System.Int32).Constant<Services.DataClasses.CustomerStatuses>(Active)
}
.Lambda#Lambda1(Services.DataClasses.CustomerDC$x)
{
(System.Int32)$x.CustomerStatusID==(System.Int32).常量(活动)
}
虽然对我的树遍历代码的修复非常简单,而且附加的细节也很受欢迎,但是有人知道有其他类似这样的陷阱吗


或者,是否有人链接到有关如何改进过载解决方案的详细信息?我找不到。

这与过载分辨率无关。上一个编译器过早地优化了比较的右侧,从而省略了与源表达式对应的代码。

运行时异常类型和消息是什么?您应该更新您的问题,您的第一句话指出,
我在以前工作的代码上收到一个运行时错误。
。这只是枚举值为0的问题,对吗?我怀疑这与编译器使用默认值进行某种优化有关,它确实不应该对表达式树进行优化,并且被认为是一个bug。xanatos是正确的。如果没有我们的防御性编码实践,我们最终可能会得到一个普通的NullRef,或者更糟糕的是,错误的结果。我担心的是,我找不到任何关于这一C#6.0变化的文献,因为新的合成糖和功能增加了引人注目的内容。我所看到的重载更改只是模糊地提到了nullables,但没有示例。因此我要求社区。如果你还没有发布/询问这个。