问题
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);
来源:https://stackoverflow.com/questions/10589803/stackt-implements-icollection-but-has-methods-from-icollectiont