Stack<T> 实现了 ICollection 接口,但拥有来自 ICollection<T> 的方法。

6
我正在尝试创建一个基于Stack<T>的自定义集合。当我在 Visual Studio 中查看元数据中的Stack<T>时,它显示Stack<T>实现了ICollection,这将要求它实现ICollectionCopyTo(Array array, index)方法,但实际上,它被显示为具有ICollection<T>CopyTo(T[] array, index)方法。有人能解释一下为什么会这样吗?
我正试图创建一个与Stack<T>非常相似的集合。当我像栈一样实现ICollection时,它要求我使用CopyTo(Array array, index)方法,但我真正想要的是像Stack<T>那样使用CopyTo(T[] array, index)方法。有没有一种方法可以在不实现ICollection<T>的情况下实现这一点?

9
这些方法是明确实现的。明确实现的方法不是公共的,因此不会出现在元数据中(元数据只列出公共属性)。 - Jeff Mercado
1
你可以尝试使用.NET Reflector来查看Stack<T>的实际完整源代码,包括私有方法。 - mellamokb
1
发布了 .NET 4.0 版本的 Stack<T> 实现,如果您想看一下,请访问 http://pastebin.com/p2k4URtU。 - SPFiredrake
2
@JeffMercado 你应该将其发布为答案,并简要解释如何显式实现接口,以便获得信用。 - C.Evenhuis
3
@MarcinJuraszek - 在Visual Studio中下载框架源代码已经有一段时间了。请看这篇文章:http://blogs.msdn.com/b/rscc/archive/2010/08/16/net-framework-4-reference-source-is-available.aspx - Peter Lillevold
显示剩余4条评论
2个回答

3

正如其他人所写的那样,您可以使用显式接口实现来满足您的非泛型接口:

void ICollection.CopyTo(Array array, int arrayIndex)
{
  var arrayOfT = array as T[];
  if (arrayOfT == null)
    throw new InvalidOperationException();
  CopyTo(arrayOfT, arrayIndex); // calls your good generic method
}

0

我猜测方法CopyTo(Array array, index)是显式实现的。这意味着,只有当您将对象视为ICollection时,才会看到该方法:

var collection = (ICollection)stack;
collection.CopyTo(array, 0);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接