c# .net

c# - ¿Cómo List<T> hace que IsReadOnly sea privado cuando IsReadOnly es un miembro de la interfaz?



.net (3)

En el caso de que sea List<T> , IsReadOnly realmente no tiene sentido: siempre es false . Por lo tanto, List implementa explícitamente la interfaz ICollection<T> (y IList ), lo que hace que la interfaz sea "privada" para un uso normal. Si necesita acceder a él de todos modos, puede hacerlo a través de una conversión explícita a la interfaz:

bool result = ((ICollection<string>)yourStringList).IsReadOnly; // Or equivalently using `IList`.

Estoy creando una clase de proxy especializada que implementa IList<T> y ajusta una instancia interna de List<T> .

List<T> implementa IList<T> , que declara a un miembro bool IsReadOnly , pero cuando intento acceder a ese miembro desde mi propia clase, no puedo porque en List<T> , IsReadOnly es privado.

Así que mi pregunta es; si una implementación de una interfaz requiere que todos los miembros implementados sean públicos, ¿por qué la List<T> implementa IsReadOnly como privada y, por lo tanto, me niega el acceso a ella?


Implementa explícitamente el miembro de la interfaz.

http://msdn.microsoft.com/en-us/library/aa288461(VS.71).aspx

Tenga en cuenta que esto no hace que el miembro de la interfaz sea private . Todavía está disponible públicamente, pero solo si mira el objeto a través de la interfaz (con conversión).


La razón por la que puede hacer esto es que utiliza una implementación de interfaz explícita.

bool IList<T>.IsReadOnly { get { ... } }

Este miembro sigue siendo accesible, pero solo se puede acceder a él a través del tipo IList<T> .

List<T> list = ...; bool isReadOnly = ((IList<T>)list).IsReadOnly;

Al implementar IList<T> , el tipo no ha prometido proporcionar un valor IsReadOnly por sí mismo. En su lugar, se promete proporcionar una propiedad IsReadOnly cuando se vea como un IList<T> . Si lo proporciona o no en la clase real es puramente una elección del autor del tipo.