c# - 这是 ExpressionTrees 错误吗? #2

标签 c# .net expression-trees

看起来 ExpressionTrees 编译器在许多行为上应该接近 C# 规范,但与 C# 不同的是,它不支持从 decimal 到任何 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。这是错误吗?

最佳答案

这可能是一个错误,也可能是我的错。对此感到抱歉。

正确进行十进制转换是在编译器和运行时中正确构建表达式树代码最困难的部分之一,因为十进制转换实际上是在运行时作为用户定义的转换实现的,但被视为内置编译器的转换。 Decimal 是唯一具有此属性的类型,因此在分析器中有各种专门用于这些情况的齿轮。实际上,分析器中有一个名为 IsEnumToDecimalConversion 的方法来处理可空枚举到可空十进制转换的特殊情况;相当复杂的特例。

很有可能我没有考虑到某些情况的相反方向,结果生成了错误的代码。感谢您的来信;我会将其发送给测试团队,我们将看看是否可以进行重现。很有可能,如果这确实是一个真正的错误,那么 C# 4 初始版本将不会修复它;在这一点上,我们只处理“用户被编译器触电”的错误,以便版本稳定。

关于c# - 这是 ExpressionTrees 错误吗? #2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1700401/

相关文章:

c# - 如何使用 Html Agility Pack 获取 img/src 或 a/hrefs?

C# linq - 在运行时更改选定的字段

c# - 动态 Linq 搜索多种类型的多列,包括可空类型

c# - 将 Select 方法用于动态查询和表达式树

c# - 如何在 TargetFrameworks 标记中每个框架运行一次的目标之前制作一个只运行一次而不是一次的 MSBuild 目标?

c# - ASP.Net C# - 将变量传递给 MySQL 查询

c# - VS.NET 应用程序图

c# - 如何在 MVC 中使用 Windows 身份验证,但使用较新的身份数据库表进行角色存储?

c# - 使用 exe 编译非托管 DLL

c# - 如何在 .NET 中测试并发场景?