2010-11-08 11 views
6

ReadOnlyCollection<T> realisiert die ICollection<T> Schnittstelle, die Methoden wie Hinzufügen und Entfernen hat. Ich weiß, wie man Methoden aus Intellisense mit Attributen ausblenden kann, aber wie ist es möglich, einen tatsächlichen Kompilierungsfehler zu verursachen, wenn ich versuche, diese Methoden zu verwenden?Wie versteckt ReadOnlyCollection hinzufügen und entfernen Methoden

(Übrigens, ich weiß, dass es keinen Sinn macht, Add and Remove auf einem ROC aufzurufen, es ist eine Frage auf Kompilierungsfehler für geerbte Mitglieder, nicht auf die richtige Datenstruktur zu verwenden).

Antwort

16

Sie sind mit explicit interface implementation, wie dies umgesetzt:

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

Verfahren noch aufrufbar ist, aber nur, wenn Sie das Objekt als ICollection<T> anzuzeigen. Zum Beispiel:

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

der Tat durch diese Methoden aus der ICollection<T> Schnittstelle explizit Umsetzung, können Sie sie nicht direkt aufrufen.
Sie müssen das Objekt (die ReadOnlyCollection-Instanz) explizit auf ICollection<T> umwandeln. Dann können Sie die Add-Methode aufrufen. (Daher wird sich der Compiler nicht beschweren, obwohl Sie eine Laufzeitausnahme bekommen).