Por que é HashSet .IsReadOnly explícita?
-
09-09-2019 - |
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 )
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 ):
- Você implementar várias interfaces com os membros contendo as mesmas assinaturas, e você quer que esses membros a se comportar de forma diferente.
- 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
.