c# – 这是一个ExpressionTrees的错误? #2

前端之家收集整理的这篇文章主要介绍了c# – 这是一个ExpressionTrees的错误? #2前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
看起来像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初始版本是不会被修正的;在这一点上,我们只采取“用户被编译器触电”的错误,以便发布稳定.

猜你在找的C#相关文章