【发布时间】: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