lambda 表达式中的枚举的编译方式不同;重载分辨率改进的结果?
Enums in lambda expressions are compiled differently; consequence of overload resolution improvements?
在试用 Visual Studio 2015 RC 时,我在之前工作的代码中收到 运行 次错误。给定作为 Expression<>
传递给函数的 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
}
但在 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)
}
虽然对我的树遍历代码的修复很简单,并且感谢更多的细节,但有谁知道像这样四处飘荡的任何其他陷阱吗?
或者,是否有人 link 了解有关如何改进重载解析的具体信息?我找不到。
这与重载决议无关。以前的编译器过早地优化了比较的右侧,从而省略了与源表达式对应的代码。
在试用 Visual Studio 2015 RC 时,我在之前工作的代码中收到 运行 次错误。给定作为 Expression<>
传递给函数的 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
}
但在 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)
}
虽然对我的树遍历代码的修复很简单,并且感谢更多的细节,但有谁知道像这样四处飘荡的任何其他陷阱吗?
或者,是否有人 link 了解有关如何改进重载解析的具体信息?我找不到。
这与重载决议无关。以前的编译器过早地优化了比较的右侧,从而省略了与源表达式对应的代码。