Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, Sinclair, Вы писали:
V>>>А как вообще сюда напишешь расширение, если Expression порождает сам компилятор?
S>>Вот так: https://github.com/bartdesmet/ExpressionFutures/tree/master/CSharpExpressions
V>Как я и сказал — переделывать сам компилятор:
V>V>the C# compiler changes required to support assignment of lambda expressions containing those language constructs to an Expression<TDelegate> is maintained separately in the ExpressionTrees branch of my Roslyn fork.
S>>То есть сами Expression есть, а вот компилятор их порождать не умеет.
V>О чём и речь.
V>Потому что у меня изначально, еще с выходом Linq, появилась идея попробовать подставить свои Expression, типа как можно делать свой AsyncMethodBuilder, но я не нашёл как.
V>У меня были свои наработки по "работающему" AST, свои Add/Mul/Const и т.д.
V>Что-то вроде:
V>V>interface IOperation<TResult>
V>{
V> TResult Execute();
V>}
V>IBinaryOp<TLeft, TRight, TResult> : IOperation<TResult>
V> where TLeft : IOperation<TLeft>
V> where TRight: IOperation<TRight>
V>{
V> public TLeft Left {get;}
V> public TRight Right {get;}
V>}
V>struct Const<T> : IOperation<T>
V>{
V> public readonly T Value;
V> public T Execute() => Value;
V>}
V>class Variable<T> : IOperation<T>
V>{
V> public T Value;
V> public readonly string Name;
V> public T Execute() => Value;
V>}
V>struct AddIntOp<TLeft, TRight> : IBinaryOp<TLeft, TRight, int>
V> where TLeft : IOperation<int>
V> where TRight: IOperation<int>
V>{
V> public TLeft Left {get;}
V> public TRight Right {get;}
V> public int Execute() => Left.Execute() + Right.Execute();
V>}
V>
V>Выражение с параметром
V>x + 42
V>порождает тип:
V>AddInt<Variable<int>, Const<int>>
V>Т.е. тоже пользовал тот факт, что джит для value-типов генерит уникальный код без боксинга.
V>Довольно шустро считало, кстате.
А зачем это всё, после C# 3.0? Уж с add int у них нету проблем.
V>Т.е., я не вижу смысла в таких ограничениях, которые обходится простым оформлением лямбды в виде внешней ф-ии.
По большому счёту, его и нет.
V>Ну, это понятно, особенно в деле unsafe.
V>Непонятно, почему поддержаны не все уже имеющиеся виды Expression.
Есть подозрение, что тупо не выделили ресурсов. Типа "EF работает? Работает. Ну и всё, оставьте лямбды в покое".
V>А какая вообще у багов "актуальность"? ))
Очень простая.
V>То, что MyPredicate не может быть статической локальной ф-ией — это просто баг, неконсистентность.
Если в
моём проекте нет нужды использовать в предикате локальную статик функцию, то мне на эту неконсистентность наплевать.
Вот с вашей точки зрения, експрешшны ещё "пилить и пилить", а с моей точки зрения linq2d уже работает прямо сейчас. На позапрошлой версии компилятора.
А с точки зрения производителя, ц каждой неконсистентности есть две оценки: стоимости починки и выигрыша от починки.
Второе напрямую зависит от тяжести последствий, частоты встречаемости, и наличия воркэраундов. К сожалению, на их весах конкретно поддержка локал статик функций приносит примерно 0 пользы при ненулевой себестоимости.