Класс выражений должен быть более точным при поиске пользовательских операторов?
sealed class Foo
{
// just the private static method!
private static int op_Implicit() { return 1; }
public static implicit operator int(Foo foo) { return 2; }
}
public class Program
{
private static void Main()
{
var param = Expression.Parameter(typeof(Foo), "x");
// IndexOutOfRangeException was unhandled!
var lambda = Expression.Lambda<Func<Foo, int>>(
Expression.Convert(param, typeof (int)), param);
}
}
Также возможно определить статический метод op_Explicit
или op_Implicit
с более чем одним аргументом, а класс Expression принимает этот метод как пользовательский оператор!
p.s. ExpressionTrees ищет операторов с флагом BindingFlags.NonPublic
, он позволяет искать операторы в пользовательских типах, которые не видны непосредственно для System.Core.dll, но также позволяет API выражений находить частные методы, которые "выглядят" как пользовательские операторы. Но правила С# не позволяют вам определять и использовать негосударственные операторы! Я думаю, что поведение API выражений должно быть одинаковым...