如何在 C# 2.0 中使用匿名泛型委托
我有一个名为 NTree 的类:
class NTree<T>
{
delegate bool TreeVisitor<T>(T nodeData);
public NTree(T data)
{
this.data = data;
children = new List<NTree<T>>();
_stopTraverse = false;
}
...
public void Traverse(NTree<T> node, TreeVisitor<T> visitor)
{
try
{
_stopTraverse = false;
TraverseInternal(node, visitor);
}
finally
{
_stopTraverse = false;
}
}
private void TraverseInternal(NTree<T> node, TreeVisitor<T> visitor)
{
if (_stopTraverse)
return;
if (!visitor(node.data))
{
_stopTraverse = true;
}
foreach (NTree<T> kid in node.children)
TraverseInternal(kid, visitor);
}
当我尝试将 Traverse 与匿名委托一起使用时,我得到:
Argument '2':无法从 'anonymous method' 转换为 'NisConverter.TreeVisitor'
代码:
tTable srcTable = new tTable();
DataRow[] rows;
rootTree.Traverse(rootTree, delegate(TableRows tr)
{
if (tr.TableName == srcTable.mappingname)
{
rows = tr.Rows;
return false;
}
});
但这不会产生错误:
static bool TableFinder<TableRows>(TableRows tr)
{
return true;
}
...
rootTree.Traverse(rootTree, TableFinder);
I试图将“箭头括号”和所有内容都交给匿名委托,但它不起作用。请帮我!
谢谢& BR-马蒂
I have a class called NTree:
class NTree<T>
{
delegate bool TreeVisitor<T>(T nodeData);
public NTree(T data)
{
this.data = data;
children = new List<NTree<T>>();
_stopTraverse = false;
}
...
public void Traverse(NTree<T> node, TreeVisitor<T> visitor)
{
try
{
_stopTraverse = false;
TraverseInternal(node, visitor);
}
finally
{
_stopTraverse = false;
}
}
private void TraverseInternal(NTree<T> node, TreeVisitor<T> visitor)
{
if (_stopTraverse)
return;
if (!visitor(node.data))
{
_stopTraverse = true;
}
foreach (NTree<T> kid in node.children)
TraverseInternal(kid, visitor);
}
When I try to use Traverse with anonymous delegate I get:
Argument '2': cannot convert from 'anonymous method' to 'NisConverter.TreeVisitor'
The code:
tTable srcTable = new tTable();
DataRow[] rows;
rootTree.Traverse(rootTree, delegate(TableRows tr)
{
if (tr.TableName == srcTable.mappingname)
{
rows = tr.Rows;
return false;
}
});
This however produces no errors:
static bool TableFinder<TableRows>(TableRows tr)
{
return true;
}
...
rootTree.Traverse(rootTree, TableFinder);
I have tried to put "arrowhead-parenthisis" and everything to anonymous delegate but it just does not work. Please help me!
Thanks & BR -Matti
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您发布的匿名委托缺少布尔值的返回(当
if(...)
防护为false
时,很可能返回值true
因此,它的签名实际上是void (TableRow)
而不是bool (TableRow)
,并且编译器无法进行转换,因此语法应该是:
The anonymous delegate you posted lacks the return of a boolean value (most probably the value
true
when theif(...)
guard isfalse
. Thus, it signature is actuallyvoid (TableRow)
instead ofbool (TableRow)
, and the compiler is unable to make the conversion.So the syntax should be:
TreeVisitor的声明是错误的:它引入了一个新的类型参数(与NTree的声明冲突)。只需删除模板内容,您就会得到:
然后您可以拥有:
The declaration of TreeVisitor is wrong: it introduces a new type parameter (which conflicts with the declaration of NTree). Just remove the template stuff and you get:
Then you can have: