Pergunta

Este

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

não compila. Eu tenho que fazer

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

porque não foi IsReadOnly implementado normalmente?

(Eu não estou pedindo como , mas por )

Foi útil?

Solução

Eu estou supondo que é porque, enquanto implementos HashSet ICollection, IsReadOnly não tem nenhum significado para HashSet. Na verdade, se você a refletir, a propriedade sempre retorna false. Implementá-lo explicitamente esconde este método a partir da interface pública.

Outra razão é porque a interface ICollection pode ser implementado por razões acidentais (por exemplo, para apoiar xaml serialização) e não porque seu necessário o uso principal da classe. Então implementá-la explicitamente pode manter a desordem fora da interface de classe.

Outras dicas

Existem basicamente duas razões pelas quais você iria recorrer a uma implementação de interface explícita (fonte: MSDN ):

  1. Você implementar várias interfaces com os membros contendo as mesmas assinaturas, e você quer que esses membros a se comportar de forma diferente.
  2. Um membro de interface não é de particular interesse para a classe, mas é necessário fazer referência a objetos pela interface.

Para HashSet<T>, o último caso aplica-se, como um conjunto de hash não é somente leitura e IsReadOnly, assim, sempre voltar false.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top