看起来 ExpressionTrees 编译器在许多行为中应该接近 C# 规范,但与 C# 不同的是,它不支持从decimal
to any enum-type
:
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 -> enum-type
存在并按 C# 规范中的说明工作,但不decimal -> enum-type
。这是一个错误吗?
这可能是一个错误,也可能是我的错。对于那个很抱歉。
正确进行十进制转换是在编译器和运行时正确构建表达式树代码最困难的部分之一,因为十进制转换实际上在运行时实现为用户定义的转换,但被编译器视为内置转换。十进制是唯一具有此属性的类型,因此分析器中针对这些情况有各种专用设备。事实上,分析器中有一个名为 IsEnumToDecimalConversion 的方法来处理可空枚举到可空十进制转换的特殊情况;相当复杂的特殊情况。
我很有可能没有考虑到某些情况,从而产生了错误的代码。感谢您的留言;我会将其发送给测试团队,我们将看看是否可以进行复制。如果这确实是一个真正的错误,则很有可能在 C# 4 初始版本中不会修复此问题;此时,我们仅处理“用户被编译器触电”的错误,以便版本稳定。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)