Stack implements ICollection, but has methods f

2019-06-19 19:13发布

问题:

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>?

回答1:

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
}


回答2:

I guess the method CopyTo(Array array, index) is implemented explicitly. This means, you will only see that method if you see the object as an ICollection:

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