Search code examples
.netstackgeneric-collectionsinterface-implementation

Stack<T> implements ICollection, but has methods from ICollection<T>


I'm trying to create a custom collection based on Stack<T>. When I look at Stack<T> [from metadata] in visual studio, it shows that Stack<T> implements ICollection, which would require it to implement ICollection's CopyTo(Array array, index) method, but instead, it is shown as having ICollection<T>'s CopyTo(T[] array, index) method. Can someone explain why this is the case?

I'm trying to create a collection that mimics Stack<T> pretty heavily. When I implement ICollection as stack does, it requires me to use the CopyTo(Array array, index) method, but what I really want is to use the CopyTo(T[] array, index) method, like Stack<T> does. Is there a way to achieve this without implementing ICollection<T>?


Solution

  • As others have written, you can use explicit interface implementation to satisfy your non-generic interface:

    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
    }