C# 委托和 lambda.不指向预期的方法
本文关键字:方法 lambda | 更新日期: 2023-09-27 18:31:27
我正在阅读有关Y组合子的博客,下面提到了一段代码:
http://blogs.msdn.com/b/wesdyer/archive/2007/02/02/anonymous-recursion-in-c.aspx
Func<int, int> fib = null;
fib = n => n > 1 ? fib(n - 1) + fib(n - 2) : n;
Func<int, int> fibCopy = fib;
Console.WriteLine(fib(6)); // displays 8
Console.WriteLine(fibCopy(6)); // displays 8
fib = n => n * 2;
Console.WriteLine(fib(6)); // displays 12
Console.WriteLine(fibCopy(6)); // displays 18
哼!? 请注意调用 fib 的结果如何变化,并且 调用 fibCopy 的结果甚至与调用 fib 的结果也不同! (看看你是否能弄清楚为什么)
海报提到这个结果会发生,但是,他没有提到为什么,我也看不出来弄清楚。我的看法是...
fib -> Points to fib sequence lambda
fibCopy -> Points to fib sequence lambda
lambda -> n * 2
fib -> points to new lambda
fibCopy -> points to fib which is pointing to new lambda....
但显然这不是正在发生的事情。
你的解释是正确的。
fibCopy -> 指向指向新 lambda 的 fib。
最后fibCopy
仍然是原始定义:
n => n > 1 ? fib(n - 1) + fib(n - 2) : n;
但是,fib
不再是递归的,调用fibCopy(6)
实际上正在运行:
n => n > 1 ? (n - 1) * 2 + (n - 2) * 2 : n