Question

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

ne compile pas. Je dois faire

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

pourquoi n'a pas été mis en œuvre IsReadOnly normalement?

(Je ne demande pas comment , mais pourquoi )

Était-ce utile?

La solution

Je devine sa cause, alors que HashSet implémente ICollection, IsReadOnly n'a pas de sens pour HashSet. En fait, si vous réfléchissiez elle, la propriété renvoie toujours false. Sa mise en œuvre se cache explicitement cette méthode de l'interface publique.

Une autre raison est que l'interface ICollection peut être mis en œuvre pour des raisons accessoires (par exemple, pour soutenir sérialisation XAML) plutôt que parce que son nécessaire à l'utilisation première de la classe. Ainsi, sa mise en œuvre peut explicitement garder l'image de fond de la classe interface.

Autres conseils

Il y a essentiellement deux raisons pour lesquelles vous avoir recours à une implémentation d'interface explicite (source: MSDN ):

  1. Vous implémenter plusieurs interfaces avec les membres contenant les mêmes signatures, et vous voulez que ces membres se comportent différemment.
  2. Un membre d'interface ne sont pas d'un intérêt particulier à la classe, mais il est nécessaire pour référencer des objets par l'interface.

Pour HashSet<T>, ce dernier cas applique, comme un ensemble de hachage est jamais lu seulement et IsReadOnly va donc toujours revenir false.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top