2010-05-04 49 views
2

我有一個叫NTree類:如何使用匿名泛型委託在C#2.0

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

當我嘗試使用匿名委託導線用我得到:

參數「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); 

我試圖把「箭頭-parenthisis」一切以匿名委託,但它只是不工作。請幫幫我!

感謝& BR -Matti

+0

什麼是TreeVisitor的聲明? 請注意,您在Traverse中有無限遞歸(不應該將它稱爲TravereInternal?),並且您在遍歷中將_stopTraverse設置爲false兩次,因此TraverseInternal將不會執行任何操作。 – Timores 2010-05-04 07:32:51

+0

@timores:謝謝,都已修復:)我可以修復功能l8r。我需要知道如何用匿名代理來完成。 – 2010-05-04 07:35:09

+0

我們仍然需要看到'TreeVisitor'的聲明 – AakashM 2010-05-04 07:40:38

回答

4

您發佈的匿名委託缺少一個布爾值的回報(最有可能的值trueif(...)後衛是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; 
    }); 
+0

可以請你給出語法。我無法添加bool關鍵字。正如我所說,我嘗試了一切。 – 2010-05-04 08:02:05

+0

SORRY&THANKS!我沒有仔細閱讀。 – 2010-05-04 08:03:54

+0

不客氣。 :) – 2010-05-04 08:05:54

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

    } 
} 
+0

Rü確定?似乎現在被編譯。 – 2010-05-04 08:05:41

+0

這就是Resharper告訴我什麼時候我有 委託bool TreeVisitor (T nodeData); – Timores 2010-05-04 08:09:08