3

Eric Lippertのブログ記事「なぜ再帰ラムダが明確な代入エラーを引き起こすのか」のコードを実行しようとしています。

しかし、実行する代わりに(またはコンパイルに「明確な割り当てエラー」を与えます:

「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
4

1 に答える 1

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);
         };
        } 
于 2013-02-18T11:28:29.333 に答える