Il indexer è implementato con esplicito implementazione dell'interfaccia, così sarete solo in grado di accedervi se si fa:
IList<int> b = new ReadOnlyCollection<int>(new[] { 2, 4, 2, 2 });
b[2] = 3;
o
var b = new ReadOnlyCollection<int>(new[] { 2, 4, 2, 2 });
((IList<int>)b)[2] = 3;
Naturalmente, sarà poi riuscire in fase di esecuzione ...
Ciò è del tutto intenzionale e disponibile - vuol dire che quando il compilatore sa è un ReadOnlyCollection
, i bit non supportate di funzionalità non sono disponibili a te, aiutandoti a distoglierti dal tempo di esecuzione.
È un passaggio interessante e relativamente inusuale, efficacemente che implementa implicitamente metà di una proprietà/indicizzatore e una metà esplicitamente.
Contrariamente alle mie pensieri precedenti, credo ReadOnlyCollection<T>
realtà implementa l'intera indicizzatore in modo esplicito, ma anche fornisce un indicizzatore pubblico in sola lettura.In altre parole, si tratta di qualcosa di simile:
T IList<T>.this[int index]
{
// Delegate interface implementation to "normal" implementation
get { return this[index]; }
set { throw new NotSupportedException("Collection is read-only."); }
}
public T this[int index]
{
get { return ...; }
}
fonte
2009-09-11 09:15:58
Ok, ma come faccio a replicare la funzionalità di ReadOnlyCollection utilizzando l'implementazione esplicita. Non vedo come sia possibile rimuovere un metodo o una proprietà dall'interfaccia. –
@EsbenP: non è possibile rimuovere un metodo dall'interfaccia ... ma è possibile renderlo disponibile solo quando il tipo statico del riferimento è l'interfaccia anziché la classe che implementa l'interfaccia. –
Ok, se ho due indicizzatori, uno di loro attuazione IList esplicitamente funziona T IList .questo [int index] { ottenere { fonte di ritorno [index]; } set { throw new NotImplementedException(); }} pubblica T questo [int index] { ottenere { fonte di ritorno [index]; } } –