我有一个名为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与匿名委托一起使用时,我得到:
参数'2':无法从'匿名方法'转换为'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);
我试图将“arrowhead-parenthisis”和所有内容都放到匿名委托中,但它只是不起作用。请帮帮我!
谢谢&amp; BR -Matti
答案 0 :(得分:4)
您发布的匿名委托缺少布尔值的返回值(当true
后卫为if(...)
时,很可能是值false
。因此,它的签名实际上是{{1}而不是void (TableRow)
,编译器无法进行转换。
所以语法应该是:
bool (TableRow)
答案 1 :(得分:1)
TreeVisitor的声明是错误的:它引入了一个新的类型参数(与NTree的声明冲突)。只需删除模板内容即可:
delegate bool TreeVisitor(T nodeData);
然后你可以:
class X
{
void T()
{
NTree<int> nti = new NTree<int>(2);
nti.Traverse(nti, delegate(int i) { return i > 4; });
}
}