2010-11-08 21 views
6

ReadOnlyCollection<T> nhận giao diện ICollection<T> có các phương thức như Thêm và Xoá. Tôi biết cách ẩn các phương thức từ Intellisense bằng cách sử dụng các thuộc tính, nhưng làm sao có thể gây ra một lỗi biên dịch thực sự nếu tôi cố gắng sử dụng các phương thức này?Làm thế nào để ReadOnlyCollection ẩn Thêm và Xóa phương pháp

(Btw, tôi biết nó không có ý nghĩa khi gọi thêm và xóa trên ROC, đó là câu hỏi gây ra lỗi biên dịch cho bộ nhớ kế thừa, chứ không phải sử dụng cấu trúc dữ liệu chính xác).

Trả lời

16

Họ đang thực hiện với explicit interface implementation, như thế này:

void ICollection<T>.Add(T item) { 
    throw NotSupportedException(); 
} 

phương pháp này vẫn còn có thể được gọi, nhưng chỉ khi bạn xem các đối tượng như một ICollection<T>. Ví dụ:

ReadOnlyCollection<int> roc = new ReadOnlyCollection<int>(new[] { 1, 2, 3 }); 
// Invalid 
// roc.Add(10); 

ICollection<int> collection = roc; 
collection.Add(10); // Valid at compile time, but will throw an exception 
2

Thực tế, bằng cách triển khai các phương thức đó từ giao diện ICollection<T> một cách rõ ràng, bạn không thể gọi trực tiếp cho họ.
Bạn sẽ phải truyền đối tượng (ví dụ ReadOnlyCollection) đến ICollection<T> một cách rõ ràng. Sau đó, bạn có thể gọi phương thức Thêm. (Do đó, trình biên dịch sẽ không phàn nàn, mặc dù bạn sẽ nhận được một ngoại lệ thời gian chạy).

Các vấn đề liên quan