【问题标题】:Stack<T> implements ICollection, but has methods from ICollection<T>Stack<T> 实现 ICollection,但具有来自 ICollection<T> 的方法
【发布时间】:2012-05-22 07:40:03
【问题描述】:

我正在尝试基于Stack&lt;T&gt; 创建一个自定义集合。当我在 Visual Studio 中查看Stack&lt;T&gt; [来自元数据] 时,它显示Stack&lt;T&gt; 实现了ICollection,这将要求它实现ICollectionCopyTo(Array array, index) 方法,但相反,它显示为具有ICollection&lt;T&gt;CopyTo(T[] array, index) 方法。有人可以解释为什么会这样吗?

我正在尝试创建一个非常模仿Stack&lt;T&gt; 的集合。当我像堆栈一样实现ICollection 时,它需要我使用CopyTo(Array array, index) 方法,但我真正想要的是使用CopyTo(T[] array, index) 方法,就像Stack&lt;T&gt; 一样。有没有办法在不实现ICollection&lt;T&gt; 的情况下实现这一目标?

【问题讨论】:

  • 方法是显式实现的。显式实现的方法不是公共的,因此不会显示在元数据中(仅列出公共属性)。
  • 你可以试试 .NET Reflector 看看Stack&lt;T&gt;的实际完整源代码,包括私有方法。
  • 发布了 Stack 的 .NET 4.0 实现,如果您想看看的话。 pastebin.com/p2k4URtU
  • @JeffMercado 您可能应该将其发布为答案,并简要说明如何显式实现接口以便获得荣誉。
  • @MarcinJuraszek - 从 VS 中下载框架源代码已经存在了一段时间。看看这篇文章:blogs.msdn.com/b/rscc/archive/2010/08/16/…

标签: .net stack generic-collections interface-implementation


【解决方案1】:

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

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
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      相关资源
      最近更新 更多