这是表达树大吗? #4

时间:2009-11-21 14:17:55

标签: c# .net expression-trees

这不是“接近真实”的情况,但它表明如果在源类型中找到合适的运算符,Expressions API不会在目标转换类型中查找运算符。

sealed class Foo
{
  public static explicit operator Bar(Foo foo) { return null; }
}

sealed class Bar
{
  public static implicit operator Bar(Foo foo) { return null; }
}

class Program
{
  public static void Blah(Bar bar) { }

  private static void Main()
  {
    Expression<Func<Foo, Bar>> expr1 = x => x;

    // fine, used implicit operator from Bar

    var param = Expression.Parameter(typeof(Foo), "x");

    var expr2 = Expression.Lambda<Func<Foo, Bar>>(
      Expression.Convert(param, typeof(Bar)),
      param);

    // fine, but used explicit operator from Foo!
  }
}

此外,如果模拟两种类型中用户定义的运算符之间的歧义,C#编译器根本不编译转换,但Expressions API将使用转换源类型的运算符。

1 个答案:

答案 0 :(得分:5)

不,这不是表达式树的错误。如果您无法为表达式树库提供足够的信息来执行您想要的操作,那么您只需接受其默认值即可。没有理由认为这些默认值需要遵循C#的规则;表达式树库不是C#编译器