2010-11-08 11 views
6

ReadOnlyCollection<T> realizuje interfejs ICollection<T>, który ma metody takie jak Dodaj i Usuń. Wiem, jak ukryć metody z Intellisense za pomocą atrybutów, ale jak to możliwe, aby spowodować rzeczywisty błąd kompilacji, jeśli spróbuję użyć tych metod?W jaki sposób ReadOnlyCollection ukrywać Dodaj i usuń metody

(Btw, wiem, że nie ma sensu wywoływać Add and Remove na ROC, to jest pytanie o powodowanie błędu kompilacji dla odziedziczonych członków, a nie o używanie prawidłowej struktury danych).

Odpowiedz

16

Są one realizowane z explicit interface implementation coś takiego:

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

Metoda jest jeszcze wymagalne, ale tylko jeśli się obiekt jako ICollection<T>. Na przykład:

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

Rzeczywiście, poprzez wdrożenie tych metod z interfejsu ICollection<T> jawnie nie można nazwać ich bezpośrednio.
Musisz rzucić obiekt (instancja ReadOnlyCollection) jawnie do ICollection<T>. Następnie możesz wywołać metodę Add. (W związku z tym kompilator nie będzie narzekał, mimo że otrzymasz wyjątek środowiska wykonawczego).

Powiązane problemy