Các indexer được thực hiện với rõ ràng thực hiện giao diện, vì vậy bạn sẽ chỉ có thể truy cập vào nó nếu bạn làm:
IList<int> b = new ReadOnlyCollection<int>(new[] { 2, 4, 2, 2 });
b[2] = 3;
hoặc
var b = new ReadOnlyCollection<int>(new[] { 2, 4, 2, 2 });
((IList<int>)b)[2] = 3;
Tất nhiên, nó sau đó sẽ thất bại ở thời gian thực hiện ...
này là hoàn toàn có chủ ý và hữu ích - nó có nghĩa là khi trình biên dịch biết đó là một ReadOnlyCollection
, các bit không được hỗ trợ chức năng không có sẵn với bạn, giúp chuyển hướng bạn khỏi lỗi thời gian thực hiện.
Đây là một bước thú vị và tương đối bất thường, hiệu quả thực hiện một nửa thuộc tính/chỉ mục ngầm và một nửa rõ ràng.
Trái ngược với suy nghĩ trước đây của tôi, tôi tin rằng ReadOnlyCollection<T>
thực thực hiện toàn bộ indexer một cách rõ ràng, nhưng cũng cung cấp một indexer readonly công cộng.Nói cách khác, nó là một cái gì đó như thế này:
T IList<T>.this[int index]
{
// Delegate interface implementation to "normal" implementation
get { return this[index]; }
set { throw new NotSupportedException("Collection is read-only."); }
}
public T this[int index]
{
get { return ...; }
}
Nguồn
2009-09-11 09:15:58
Ok, nhưng làm thế nào để tôi sao chép chức năng của ReadOnlyCollection bằng cách sử dụng thực hiện rõ ràng. Tôi không thấy làm thế nào bạn có thể loại bỏ một phương pháp hoặc tài sản từ giao diện. –
@EsbenP: Bạn không thể xóa một phương thức khỏi giao diện ... nhưng bạn có thể làm cho nó chỉ khả dụng khi kiểu tĩnh của tham chiếu là giao diện chứ không phải lớp thực hiện giao diện. –
Ok, nếu tôi có hai bộ chỉ mục, một trong số họ thực hiện IList rõ ràng nó hoạt động T IList .Đây [int index] { được { nguồn trở lại [index]; } đặt { ném mới NotImplementedException(); } } công khai T [int index] { nhận { nguồn trả về [index]; } } –