indexer realizowany jest jawne implementacja interfejsu, więc można tylko do niego dostęp, jeśli zrobić:
IList<int> b = new ReadOnlyCollection<int>(new[] { 2, 4, 2, 2 });
b[2] = 3;
lub
var b = new ReadOnlyCollection<int>(new[] { 2, 4, 2, 2 });
((IList<int>)b)[2] = 3;
Oczywiście, będzie to wówczas nie w czasie wykonywania ...
Jest to całkowicie zamierzone i pomocny - to oznacza, że gdy kompilator wie to ReadOnlyCollection
, nieobsługiwane bity funkcjonalności nie są dostępne dla ciebie, pomagając odciągnąć cię od niepowodzenia czasu wykonania.
Jest to interesujący i stosunkowo nietypowy krok, jednak skutecznie implementowanie pośrednio jednej własności/indeksera, a jedna połowa jawnie.
przeciwieństwie do moich poprzednich myśli, wierzę ReadOnlyCollection<T>
faktycznie wdraża cały podziałowe wyraźnie, ale również zapewnia publiczną readonly podziałowe.Innymi słowy, jest to coś takiego:
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 ...; }
}
Ok, ale w jaki sposób mogę replikować funkcjonalność ReadOnlyCollection za pomocą jawnej implementacji. Nie widzę sposobu, w jaki można usunąć metodę lub właściwość z interfejsu. –
@EsbenP: Nie można usunąć metody z interfejsu ... ale można ją udostępnić tylko wtedy, gdy statyczny typ odwołania jest interfejsem, a nie klasą implementującą interfejs. –
Ok, jeśli mam dwie indeksujących, jeden z nich wdrożenie IList wyraźnie działa T IList .To [int index] { dostać { źródło Powrót [indeks]; } zestaw { rzucić nowe NotImplementedException(); } } T publicznego w [Int indeks] { się { powrotu sieci [indeks]; } } –