Это ошибка ExpressionTrees? #4

Это не "близко к реальной" ситуации, но она показывает, что 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# вообще не компилирует преобразование, но API выражений будет использовать оператор из исходного типа преобразования.


person controlflow    schedule 21.11.2009    source источник


Ответы (1)


Нет, это не ошибка дерева выражений. Если вы не предоставите достаточно информации для того, чтобы библиотека дерева выражений делала то, что вам нужно, вам просто придется принять ее значения по умолчанию. Нет никакой причины, по которой эти значения по умолчанию должны следовать правилам C#; библиотеки дерева выражений не являются компилятором C#.

person Eric Lippert    schedule 21.11.2009