Pregunta

Este

var h = new HashSet<int>();
var r = h.IsReadOnly;

no se compila. Tengo que hacer

var r = ((ICollection<int>)h).IsReadOnly;

¿Por qué no se aplicó IsReadOnly normalmente?

(No estoy pidiendo ¿Cómo , pero ¿Por qué )

¿Fue útil?

Solución

supongo que es porque, mientras que HashSet implementa ICollection, IsReadOnly no tiene sentido para HashSet. De hecho, si se reflexiona, la propiedad siempre devuelve falso. Implementarlo de manera explícita esconde este método de la interfaz pública.

Otra razón es porque la interfaz ICollection puede implementarse debido a razones accidentales (por ejemplo, para apoyar la serialización xaml) en lugar de debido a que su necesario el uso principal de la clase. Así implementarlo de manera explícita puede mantener el desorden fuera de la interfaz de clase.

Otros consejos

Existen básicamente dos razones por las que recurriría a una implementación de interfaz explícita (fuente: MSDN ):

  1. implementar múltiples interfaces con los miembros que contienen las mismas firmas, y desea que estos miembros se comporten de forma diferente.
  2. Un miembro de interfaz no es de particular interés para la clase, pero se requiere con el fin de hacer referencia a objetos por la interfaz.

Para HashSet<T>, el último caso se aplica, como un conjunto de hash nunca es de sólo lectura y por lo tanto siempre habrá IsReadOnly volver false.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top