看起来像ExpressionTrees编译器应该在很多行为的C#规范附近,但与C#不同,不支持从十进制到任何枚举类型的转换:
using System; using System.Linq.Expressions; class Program { static void Main() { Func<decimal,ConsoleColor> converter1 = x => (ConsoleColor) x; ConsoleColor c1 = converter1(7m); // fine Expression<Func<decimal,ConsoleColor>> expr = x => (ConsoleColor) x; // System.InvalidOperationException was unhandled // No coercion operator is defined between types // 'System.Decimal' and 'System.ConsoleColor'. Func<decimal,ConsoleColor> converter2 = expr.Compile(); ConsoleColor c2 = converter2(7m); } }
其他很少使用的C#显式转换,如double – >枚举类型存在并按照C#规范中说明的方式工作,但不是十进制 – >枚举类型.这是一个bug吗?
解决方法
这可能是一个错误,这可能是我的错.对于那个很抱歉.
在编译器和运行时,正确编写表达式树代码是最重要的部分之一,因为十进制转换在运行时实际上是以用户定义的转换实现的,而是被编译器视为内置转换.十进制是具有此属性的唯一类型,因此在这些情况下,分析仪中有各种专用齿轮.实际上,在分析器中有一个叫做IsEnumToDecimalConversion的方法来处理可空的枚举到可空的十进制转换的特殊情况;相当复杂的特殊情况.
赔率是好的,我没有考虑到一些情况,另一方面,并产生坏的代码,结果.谢谢你的笔记我会把它发送给测试团队,我们会看看我们是否可以重做.赔率是好的,如果这确实证明是真正的错误,这对于C#4初始版本是不会被修正的;在这一点上,我们只采取“用户被编译器触电”的错误,以便发布稳定.