6

Я пытаюсь создать пользовательскую коллекцию на основе Stack<T>. Когда я смотрю на Stack<T> [из метаданных] в визуальной студии, это показывает, что Stack<T> реализует ICollection, что потребовало бы его для реализации ICollectionCopyTo(Array array, index), но вместо этого оно показано как CopyTo(T[] array, index). Может кто-нибудь объяснить, почему это так?Стек <T> реализует ICollection, но имеет методы от ICollection <T>

Я пытаюсь создать коллекцию, которая имитирует Stack<T> довольно сильно. Когда я реализую ICollection в качестве стека, он требует, чтобы я использовал метод CopyTo(Array array, index), но то, что я хочу , это использовать метод CopyTo(T[] array, index), например Stack<T>. Есть ли способ достичь этого без внедрения ICollection<T>?

+9

Методы реализованы явно. Явно реализованные методы не являются общедоступными и, следовательно, не будут отображаться в метаданных (в которых перечислены только публичные свойства). –

+1

Вы можете попробовать .NET Reflector, чтобы увидеть полный полный исходный код 'Stack ', включая частные методы. – mellamokb

+0

@JeffMercado Вау ... Я не могу поверить, что все было так просто. Я всегда задавался вопросом, что означало «Явно Реализовать suchnsuch». Благодарю. –

ответ

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);