2012-05-14 29 views
6

Tôi đang cố tạo bộ sưu tập tùy chỉnh dựa trên Stack<T>. Khi tôi nhìn vào Stack<T> [từ metadata] trong visual studio, nó cho thấy rằng Stack<T> cụ ICollection, mà sẽ yêu cầu nó để thực hiện ICollection 'CopyTo(Array array, index) phương pháp s, nhưng thay vào đó, nó được hiển thị là có ICollection<T>' s CopyTo(T[] array, index) phương pháp. Ai đó có thể giải thích tại sao đây là trường hợp?Stack <T> thực hiện ICollection, nhưng có phương pháp từ ICollection <T>

Tôi đang cố gắng tạo bộ sưu tập bắt chước Stack<T> khá nhiều. Khi tôi triển khai ICollection làm ngăn xếp, nó yêu cầu tôi sử dụng phương pháp CopyTo(Array array, index), nhưng những gì tôi thực sự là muốn sử dụng phương pháp CopyTo(T[] array, index), chẳng hạn như Stack<T>. Có cách nào để đạt được điều này mà không cần triển khai ICollection<T> không?

+9

Các phương pháp được triển khai rõ ràng. Các phương thức được triển khai rõ ràng không công khai và do đó sẽ không hiển thị trong siêu dữ liệu (chỉ liệt kê các thuộc tính công khai). –

+1

Bạn có thể thử .NET Reflector để xem mã nguồn hoàn chỉnh thực tế của 'Stack ', bao gồm cả các phương thức riêng. – mellamokb

+0

@JeffMercado Wow ... Tôi không thể tin rằng điều đó thật dễ dàng. Tôi luôn tự hỏi điều gì "Triển khai rõ ràng như vậy" nghĩa là gì. Cảm ơn. –

Trả lời

3

Như những người khác đã viết, bạn có thể sử dụng thực hiện giao diện rõ ràng để đáp ứng giao diện phi generic của bạn:

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

Tôi đoán phương pháp CopyTo(Array array, index) được thực hiện một cách rõ ràng. Điều này có nghĩa là, bạn sẽ chỉ thấy phương thức đó nếu bạn thấy đối tượng dưới dạng ICollection:

var collection = (ICollection)stack; 
collection.CopyTo(array, 0); 
Các vấn đề liên quan