为什么这个错误“;局部变量不能在此作用域中声明,因为它..已使用”;
本文关键字:因为 声明 错误 局部变量 为什么 不能 作用域 | 更新日期: 2023-09-27 18:00:08
我正在尝试运行Eric Lippert的博客文章中的代码"为什么递归lambda会导致确定的赋值错误?"
但我得到的不是运行(或给出编译"明确的分配错误"):
不能在此作用域中声明名为"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
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);
};
}