【问题标题】:how to use anonymous generic delegate in C# 2.0如何在 C# 2.0 中使用匿名泛型委托
【发布时间】:2010-05-04 07:17:43
【问题描述】:

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

我试图将“箭头括号”和所有内容都放在匿名委托中,但它不起作用。请帮帮我!

谢谢和BR-马蒂

【问题讨论】:

  • TreeVisitor 的声明是什么?请注意,您在 Traverse 中有无限递归(不应该调用 TravereInternal 吗?)并且您在 Traverse 中将 _stopTraverse 设置为 false 两次,因此 TraverseInternal 不会做任何事情。
  • @timores:谢谢,两者都已修复 :) 我可以修复 l8r 的功能。我需要知道如何使用匿名委托。
  • 我们还需要看TreeVisitor的声明
  • @Aakas:我在 10 分钟前更新了它。有什么问题吗?我在课堂上看到了它的最高声明:)

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


【解决方案1】:

您发布的匿名委托缺少布尔值的返回(当if(...) 保护为false 时,很可能值true。因此,它的签名实际上是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;
    });

【讨论】:

  • 你能给出语法吗?我无法添加 bool 关键字。正如我所说,我已经尝试了一切。
  • 对不起,谢谢!我没有仔细阅读。
【解决方案2】:

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

    }
}

【讨论】:

  • 你确定吗?似乎现在可以编译了。
  • 当我有委托 bool TreeVisitor(T nodeData); 这就是 Resharper 告诉我的
猜你喜欢
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 2023-01-26
  • 2010-09-24
  • 1970-01-01
相关资源
最近更新 更多