C#:与Lambda表达式

问题描述:

递归函数以下不会编译:C#:与Lambda表达式

Func<int, int> fac = n => (n <= 1) ? 1 : n * fac(n - 1); 

局部变量“FAC”可能不会 访问

之前,你怎么能与一个递归函数初始化lambda表达式?

[更新]

这里还有两个环节,我发现有趣的阅读:

  1. Eric Lippert's "Why does a recursive lambda cause a definite assignment error?"
  2. Anonymous Recursion in C#
+2

你真的想这样做在同一行?这看起来像一个噩梦的可维护性和理解... – Ian 2009-07-03 12:36:15

+0

好吧,也许只是一个概念 – 2009-07-03 12:37:01

的功能,这种特殊的风格是不支持由C#作为单行声明。你必须声明和定义分离成2线

Func<int, int> fac = null; 
fac = n => (n <= 1) ? 1 : n * fac(n - 1); 

你必须创建fac第一UND以后分配给它(这是相当非功能,因为它取决于多种分配),或者使用所谓的Y-combinators

例子:

delegate Func<TIn, TOut> FixedPointFunction<TIn, TOut>(Func<TIn, TOut> f); 

static Func<T, TRes> Fix<T, TRes>(FixedPointFunction<T, TRes> f) { 
    return f(x => Fix(f)(x)); 
} 

static void Main(string[] args) { 

    var fact = Fix<int, int>(f => x => (x <= 1) ? x : x * f(x - 1)); 

    Console.WriteLine(fact(5));    
} 

但是请注意,这可能是有点难以读取/理解。

好吧,如果您只是输入“为什么递归lambda会导致明确的赋值错误?”进入一些搜索引擎,你会在我的文章中找到关于这个主题的答案。

:-)

http://blogs.msdn.com/ericlippert/archive/2006/08/18/why-does-a-recursive-lambda-cause-a-definite-assignment-error.aspx

由于C#7.0,你终于可以使用一个local function

int fac(int n) => (n <= 1) ? 1 : n * fac(n - 1);