2013-12-18 176 views
0

(標題是不是很好,我應該......隨意更改,我希望我可以用一個例子更好地表達自己)Foreach循環

我有以下類:

abstract class AbstractObject<T> 
{ 
List<T> Children { get; protected set; } 
} 

class A : AbstractObject<A> 
{ 
//I have access to a List<A> 
} 

class B : AbstractObject<B> 
{ 
//I have access to a List<B> 
} 

然後,在某些時候,我有以下方法:

private TreeNode PupulateRecursively<T>(AbstractObject<T> _us) 
    { 
     if (_us.Children == null || _us.Children.Count == 0) 
     { 
      return new TreeNode(string.Format("{0} - {1}", _us.FormattedID, _us.Name)) { Tag = _us }; 
     } 
     else 
     { 
      Debug.Assert(_us.Children.Count > 0); 

      TreeNode node = new TreeNode(string.Format("{0} - {1}", _us.FormattedID, _us.Name)) { Tag = _us }; 
      foreach (var child in _us.Children) 
      { 
       TreeNode n = PupulateRecursively(child); 
       node.Nodes.Add(n); 
      } 
      return node; 
     } 
    } 

但我發現了一個:The type arguments for method PupulateRecursively<T> (AbstractRallyObject<T>) cannot be inferred from the usage. Try specifying the type arguments explicitly.,因爲child這個foreach中的var是T類型的。

我該如何解決這個問題?這是一個設計問題?

回答

1

PupulateRecursively<T>的參數是一個AbstractRallyObject<T>但你傳遞一個T

foreach (var child in _us.Children)   // Children is a List<T> 
{ 
    TreeNode n = PupulateRecursively(child); //child is a T 

可以Children定義爲List<AbstractObject<T>> whichi 編譯但我不k現在足以說明你的設計是否是正確

+0

它顯然工作。我正在檢查解決方案中兒童列表訪問的其他地方,但目前看起來很好。謝謝 –

0

看來你打電話給你PupulateRecursively方法沒有通用的說法是這樣的:

TreeNode n = PupulateRecursively<T>(child); 
+0

這是不是這種情況,請參閱d斯坦利的答案,請。 –

0

看起來你需要確定你的集合作爲List<AbstractObject<T>>

abstract class AbstractObject<T> 
{ 
    List<AbstractObject<T>> Children { get; protected set; } 
}