Foreach循环
问题描述:
(标题是不是很好,我应该......随意更改,我希望我可以用一个例子更好地表达自己)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类型的。
我该如何解决这个问题?这是一个设计问题?
答
到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现在足以说明你的设计是否是正确。
答
看来你打电话给你PupulateRecursively方法没有通用的说法是这样的:
TreeNode n = PupulateRecursively<T>(child);
+0
这是不是这种情况,请参阅d斯坦利的答案,请。 –
答
看起来你需要确定你的集合作为List<AbstractObject<T>>
abstract class AbstractObject<T>
{
List<AbstractObject<T>> Children { get; protected set; }
}
它显然工作。我正在检查解决方案中儿童列表访问的其他地方,但目前看起来很好。谢谢 –