如何在C#2.0中使用匿名通用委托

时间:2010-05-04 07:17:43

标签: c# generics c#-2.0 anonymous-delegates

我有一个名为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

2 个答案:

答案 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; });

    }
}