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.