2009-04-13 8 views

Respuesta

16

supongo que es porque, mientras que HashSet implementa ICollection, IsReadOnly no tiene sentido para HashSet. De hecho, si lo refleja, la propiedad siempre devuelve falso. Implementarlo explícitamente oculta este método de la interfaz pública.

Otra razón es porque la interfaz ICollection puede implementarse por razones secundarias (por ejemplo, para admitir la serialización xaml) en lugar de porque es necesaria para el uso principal de la clase. Así que implementarlo explícitamente puede mantener el desorden de la interfaz de la clase.

+0

Ah, sí, eso tiene sentido. HashSet también oculta IsReadOnly por el mismo motivo, supongo, de ahí el error de compilación si intentas usarlo. –

+0

Por cierto, no es necesario implementar ICollection para la serialización xaml; las colecciones deben implementar IDictionary o IList. Fue solo un ejemplo de ocasiones en las que podría necesitar implementar una interfaz por motivos incidentales. – Will

5

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

  1. a 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 la interfaz no es de particular interés para la clase, pero se requiere para hacer referencia a objetos por la interfaz.

Para HashSet<T>, se aplica el último caso, como un conjunto de hash no es de sólo lectura y IsReadOnly será así siempre volver false.

Cuestiones relacionadas