Die indexer wird mit expliziten umgesetzt Interface-Implementierung, so dass Sie nur in der Lage sein, es zugreifen, wenn Sie tun:
IList<int> b = new ReadOnlyCollection<int>(new[] { 2, 4, 2, 2 });
b[2] = 3;
oder
var b = new ReadOnlyCollection<int>(new[] { 2, 4, 2, 2 });
((IList<int>)b)[2] = 3;
Natürlich wird es dann bei der Ausführung scheitern ...
Diese ganz bewusste und hilfreich ist - es bedeutet, dass, wenn der Compiler weiß, es ist ein ReadOnlyCollection
, sind die nicht unterstützte Bits Funktionalität nicht verfügbar Ihnen helfen, Sie von Ausführungszeitfehlern abzulenken.
Es ist ein interessanter und relativ ungewöhnlicher Schritt jedoch, effektiv Implementierung einer Hälfte einer Eigenschaft/Indexer implizit und eine Hälfte explizit.
Im Gegensatz zu meinen früheren Gedanken, ich glaube ReadOnlyCollection<T>
tatsächlich explizit den ganzen Indexer implementiert, aber bietet auch einen öffentlichen Nur-Lese-Indexer.Mit anderen Worten, es ist so etwas wie dieses:
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, aber wie repliziere ich die Funktionalität von ReadOnlyCollection mit expliziter Implementierung. Ich sehe nicht, wie Sie eine Methode oder Eigenschaft aus der Schnittstelle entfernen können. –
@EsbenP: Sie können eine Methode nicht aus der Schnittstelle entfernen ... Sie können sie jedoch nur verfügbar machen, wenn der statische Typ der Referenz die Schnittstelle und nicht die Klasse ist, die die Schnittstelle implementiert. –
Ok, wenn ich zwei Indexer haben, einer von ihnen die Umsetzung IList explizit funktioniert es T IList .Dieses [int index] { erhalten { return Quelle [index]; } set { werfen neue NotImplementedException(); } } public T dieses [int index] { erhalten { return Quelle [index]; } } –