微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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初始版本是不会被修正的;在这一点上,我们只采取“用户被编译器触电”的错误,以便发布稳定.

原文地址:https://www.jb51.cc/csharp/94943.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐