Domanda

Questo

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

non viene compilato. Devo fare

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

il motivo per cui non è stato implementato IsReadOnly normalmente?

(Non sto chiedendo come , ma perché )

È stato utile?

Soluzione

sto cercando di indovinare la sua causa, mentre HashSet implementa ICollection, IsReadOnly ha alcun significato per HashSet. In realtà, se si riflette che, la proprietà restituisce sempre false. L'implementazione in modo esplicito questo metodo nasconde dall'interfaccia pubblica.

Un'altra ragione è che l'interfaccia ICollection può essere implementato per motivi accidentali (ad esempio, per supportare xaml serializzazione) piuttosto che per il suo necessario l'uso primario della classe. Così la sua attuazione in modo esplicito può mantenere il disordine fuori l'interfaccia di classe.

Altri suggerimenti

Ci sono fondamentalmente due ragioni per cui si dovrebbe ricorrere ad un'implementazione dell'interfaccia esplicita (fonte: MSDN ):

  1. implementare più interfacce con i membri che contengono le stesse firme, e si desidera questi membri a comportarsi in modo diverso.
  2. Un elemento di interfaccia non è di particolare interesse per la classe, ma è necessaria per fare riferimento a oggetti dall'interfaccia.

Per HashSet<T>, si applica quest'ultimo caso, come un insieme di hash non è mai sola lettura e IsReadOnly sarà quindi sempre tornare false.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top