【问题标题】:Enums in lambda expressions are compiled differently; consequence of overload resolution improvements?lambda 表达式中的枚举的编译方式不同;重载分辨率改进的结果?
【发布时间】:2015-08-12 20:05:16
【问题描述】:

在试用 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)
}

虽然对我的树遍历代码的修复很简单,并且非常感谢您提供额外的细节,但有没有人知道任何其他类似这样的问题?

另外,是否有人提供有关如何改进重载解决方案的详细信息的链接?我找不到。

【问题讨论】:

  • 运行时异常类型和消息是什么?
  • 你应该更新你的问题,你的第一句话说I received a run-time error on previously working code
  • 这只是枚举值为 0 的问题,对吗?我怀疑它与编译器使用默认值进行某种优化有关,它确实不应该对表达式树进行并且被认为是一个错误。
  • xanatos 是正确的。如果没有我们的防御性编码实践,我们最终可能会得到一个普通的 NullRef,或者更糟的是,无声无息的错误结果。我担心的是我找不到任何关于这个 C# 6.0 更改的文献,因为新的语法糖和功能添加抢了风头。我所见过的关于重载变化的只是模糊地提到了可空值,但没有例子。因此我问社区。​​span>
  • 如果您还没有,您应该在github.com/dotnet/roslyn/issues 上发布/询问。

标签: c# lambda enums roslyn c#-6.0


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    相关资源
    最近更新 更多