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.... 

但显然这不是正在发生的事情。

C# 委托和 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