2013-02-18 39 views
3

我试图通过Eric Lippert "Why does a recursive lambda cause a definite assignment error?"为什么这个错误“局部变量不能在此范围内声明,因为它已被使用”?

运行从博客文章的代码,但不是运行(或给予汇编“明确分配错误”我得到:

命名为“T”的局部变量不能在此范围内声明,因为它 将给予不同的含义,以“T”,这已经是在 的母公司或电流“范围用来表示别的

为什么呢?
它在父级或当前范围中已经使用了哪些位置?
试图重命名它已经得到相同的错误
我应该如何更改代码来启动此代码?

using System; 
namespace LippertRecursiveLambdaError 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     Tree<int> tree = new Tree<int> 
     (3, new Tree<int> 
      (4, new Tree<int>(1), null), 
      new Tree<int>(5)); 
     PrintTree(tree); 
     Console.ReadLine(); 
    } 

    delegate void Action<A>(A a); 
    delegate void Traversal<T>(Tree<T> t, Action<T> a); 

    static void DepthFirstTraversal<T>(Tree<T> t, Action<T> a) 
    { 
    if (t == null) return; 
    a(t.Value); 
    DepthFirstTraversal(t.Left, a); 
    DepthFirstTraversal(t.Right, a); 
    } 
    static void Traverse<T>(Tree<T> t, Traversal<T> f, Action<T> a) 
    { 
    f(t, a); 
    } 
    static void Print<T>(T t) 
    { 
    System.Console.WriteLine(t.ToString()); 
    } 
    /*static void PrintTree<T>(Tree<T> t) 
    { 
    Traverse(t, DepthFirstTraversal, Print); 
    }*/ 

    static void PrintTree<T>(Tree<T> t) 
    { 
    //Traversal<T> df = (t, a)=>   ************** 
    Traversal<T> df = null; 
    //======================================== 
//The next line gives compilation error 
//A local variable named 't' cannot be declared in this scope 
//because it would give a different meaning to 't', 
//which is already used in a 'parent or current' scope to denote something else  
    df = (t, 
     a) => 
    { 
     if (t == null) return; 
     a(t.Value); 
     df(t.Left, a); 
     df(t.Right, a); 
    }; 
    Traverse(t, df, Print); 
    }//PrintTree 
    }//class 
    class Tree<T> 
    { 
    public Tree<T> Left; 
    public Tree<T> Right; 
    public T Value; 

    public Tree(T value) 
    { 
     Value = value; 
    } 
    public Tree(T value, Tree<T> left, Tree<T> right) 
    { 
     Value = value; 
     Left = left; 
     Right = right; 
    } 
    } 
}//namespace 
+0

我认为这是C#,而不是C(或C++或Java)。 – ecatmur 2013-02-18 11:28:40

+0

@ecatmur这绝对是C# – 2013-02-18 11:30:09

+0

这是C#。我不知道java为什么/如何跳过标签。我的错误 – Fulproof 2013-02-18 11:32:36

回答

5
static void PrintTree<T>(Tree<T> t) 
    { 
    //Traversal<T> df = (t, a)=>   ************** 
    Traversal<T> df = null; 
    //======================================== 

    df = (t,  a) => 
    { 
     if (t == null) return; 
     a(t.Value); 
     df(t.Left, a); 
     df(t.Right, a); 
    }; 
    } 

这是因为Tree<T> t是一个声明 而(t,a) =>是另一个声明..几乎同样的事情,他说:

int someFunction(T t, U a) 
//Assuming int is the return type 

反正来解决:改变t到另一个标识.. n例如

df = (n,a) =>{ 
      if (n == null) return; 
      a(n.Value); 
      df(n.Left, a); 
      df(n.Right, a); 
     }; 
     } 
+0

+1:很好的答案,但我会选择'n'(代表节点)而不是'u'。 – leppie 2013-02-18 11:34:39

+0

@leppie更改:P – 2013-02-18 11:37:08

+0

Ooops。我试图以前徒劳地重命名。可能选择了错误的字母(标识符)。神秘......我只是好奇,ppl如何写这样的(敲我)代码而不运行它? – Fulproof 2013-02-18 11:45:35

相关问题