2010-11-08 7 views
6

ReadOnlyCollection<T> realiza la interfaz ICollection<T> que tiene métodos como Agregar y Quitar. Sé cómo ocultar los métodos de Intellisense usando atributos, pero ¿cómo es posible causar un error de compilación real si trato de usar estos métodos?Cómo se lee ReadOnlyCollection Agregar y quitar métodos

(Por cierto, sé que no tiene sentido llamar a Agregar y quitar en un ROC, es una pregunta sobre causar un error de compilación para los miembros heredados, no sobre el uso de la estructura de datos correcta).

Respuesta

16

que se implementen con explicit interface implementation, así:

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

El método sigue siendo exigible, pero sólo si ve el objeto como un ICollection<T>. Por ejemplo:

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 efecto, mediante la implementación de los métodos de la interfaz ICollection<T> explícitamente, no se puede llamar directamente.
Deberás convertir el objeto (la instancia ReadOnlyCollection) al ICollection<T> explícitamente. Luego, puedes llamar al método Add. (Por lo tanto, el compilador no se quejará, aunque obtendrá una excepción de tiempo de ejecución).

Cuestiones relacionadas