2010-11-08 1 views
6

ReadOnlyCollection<T> réalise l'interface ICollection<T> qui a des méthodes comme Ajouter et supprimer. Je sais comment cacher des méthodes d'Intellisense en utilisant des attributs, mais comment est-il possible de provoquer une erreur de compilation réelle si j'essaie d'utiliser ces méthodes?Comment ReadOnlyCollection cache-t-il les méthodes d'ajout et de suppression?

(Btw, je sais que cela n'a pas de sens d'appeler Ajouter et supprimer sur un ROC, il s'agit de provoquer une erreur de compilation pour les membres hérités, pas sur l'utilisation de la structure de données correcte).

Répondre

16

Ils sont mis en œuvre avec explicit interface implementation, comme ceci:

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

La méthode est encore appelable, mais seulement si vous affichez l'objet en tant ICollection<T>. Par exemple:

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

En effet, en mettant en œuvre ces méthodes de la façon explicite l'interface ICollection<T>, vous ne pouvez pas les appeler directement.
Vous devrez lancer l'objet (l'instance ReadOnlyCollection) à ICollection<T> explicitement. Ensuite, vous pouvez appeler la méthode Add. (Par conséquent, le compilateur ne se plaindra pas, même si vous aurez une exception d'exécution).

Questions connexes