lambda表达式中的枚举的编译方式有所不同;过载分辨率改善的结果?


68

尝试使用Visual Studio 2015 RC时,我收到了先前工作代码的运行时错误。给定lambda (x => x.CustomerStatusID == CustomerStatuses.Active)作为传递给函数Expression<>,调试器将显示表达式树中的差异。以前它是这样编译的:

.Lambda #Lambda1<System.Func`2[Services.DataClasses.CustomerDC,System.Boolean]>(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)
}

尽管对我的遍历树的代码的修复很简单,并且可以理解其他细节,但是有人知道像这样漂浮的其他陷阱吗?

或者,是否有人链接到有关如何改进重载分辨率的细节的信息?我找不到。


1
什么是运行时异常类型和消息?
艾里克·飞利浦

6
您应该更新您的问题,第一句话指出I received a run-time error on previously working code
艾里克·飞利浦

2
这只是枚举值为0的问题,对吗?我怀疑这与编译器使用默认值进行某种优化有关,它实际上不应该对表达式树执行,并且被认为是一个错误。
Mike Zboray 2015年

1
xanatos是正确的。如果没有防御性的编码实践,我们最终可能会得到普通的NullRef,或更糟糕的是,无声的错误结果。我担心的是,我找不到有关C#6.0更改的任何文献,因为新的语法糖和功能部件已引起关注。我所见过的关于重载更改的内容只是模糊地提及了nullable,但没有示例。因此,我问社区。
罗恩·纽科姆

8
如果还没有的话,应该在github.com/dotnet/roslyn/issues上发布/询问。
JoshVarty

Answers:


4

这与重载解析无关。先前的编译器过早地优化了比较的右侧,从而省略了与源表达式相对应的代码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.