Как использовать анонимный универсальный делегат в C # 2.0 - PullRequest
2 голосов
/ 04 мая 2010

У меня есть класс с именем 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" и все в анонимный делегат, но он просто не работает. Пожалуйста, помогите мне!

Спасибо & BR -Matti

Ответы [ 2 ]

4 голосов
/ 04 мая 2010

Анонимному делегату, который вы опубликовали, не хватает возврата логического значения (наиболее вероятно значение true, когда if(...) охранник равен false. Таким образом, его подпись фактически void (TableRow) вместо bool (TableRow), и компилятор не может выполнить преобразование.

Таким образом, синтаксис должен быть:

tTable srcTable = new tTable();  DataRow[] rows;  rootTree.Traverse(rootTree, delegate(TableRows tr) 
    { 
        if (tr.TableName == srcTable.mappingname) 
        { 
            rows = tr.Rows; 
            return false; 
        } 
        return true;
    });
1 голос
/ 04 мая 2010

Объявление 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; });

    }
}
...