考虑以下:
static int M() { Console.Write("M"); return 1; }
static int N() { Console.Write("N"); return 2; }
static int Q(int m, int n) { return m + n; }
...
Func<int> f = ()=>Q(n : N(), m: M());
Expression<Func<int>> x = ()=>Q(n : N(), m: M());
Func<int> fx = x.Compile();
Console.WriteLine(f());
Console.WriteLine(fx());
你同意我希望最后两行必须做完全相同的事情,对吧?即打印NM3
。
现在,您希望表达式树转换生成哪个表达式树库调用来确保这一点?没有了!因此,我们面临以下选择:
- 实现表达式树库中的功能。在表达式树降低引擎中添加一个转换,以保留命名参数的执行顺序。
Compile
在考虑执行顺序的方法中实现代码。
- make
x = ()=>Q(n : N(), m: M());
实际上被实现x = ()=>Q(M(), N());
为非表达式树版本并且与非表达式树版本不兼容。
- 禁止表达式树中的命名参数。为此实施错误消息。
(1) 很好,但很贵。(2) 是非首发;我们不能凭良心介绍这种“陷阱”。(3) 便宜但刺激。
我们选择了(3)。