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.