avoir ce code ...
var b = new ReadOnlyCollection<int>(new[] { 2, 4, 2, 2 }); b[2] = 3;
3 Réponses :
Il implémente ilist.items explicitement, ce qui le rend non public, et vous devrez lancer à l'interface pour atteindre sa mise en œuvre et implémenter une nouvelle [...] indexeur, qui est utilisée à la place, qui a seulement un get-accessoir.
Si vous lancez la collection à IList, votre code compilera, mais échouera à la place à l'exécution. P>
Malheureusement, je ne sais pas comment faire cela dans C #, Puisque écrire un indexeur en C # implique d'utiliser le mot-clé code> code>, et vous ne pouvez pas écrire ceci: p>
@Lasse: Vous pouvez écrire cela - avec des implémentations appropriées. Le problème est que vous ne pouvez pas mettre en œuvre une moitié explicitement et une moitié implicitement, autant que je sache.
Vous n'êtes pas obligé, si vous pouvez écrire cela, vous écrivez le setter avec simplement lancer une exception, puis vous implémentez un public cet indexeur [..] avec juste le getter.
the indexer est implémenté avec une implémentation explicite de l'interface, donc vous " LL Ne pourrez pas y accéder si vous le faites:
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, mais comment reproduire la fonctionnalité de Readonlycollection à l'aide de la mise en œuvre explicite. Je ne vois pas comment vous pouvez supprimer une méthode ou une propriété de l'interface.
@ESBENP: Vous ne pouvez pas supprimer une méthode de l'interface ... mais vous pouvez le rendre disponible uniquement lorsque le type statique de la référence est l'interface plutôt que la classe mettant en œuvre l'interface.
OK, si j'ai deux indexeurs, l'un d'entre eux implémentant explicitement il fonctionne explicitement t iList
Vous avez cloué comment les indexateurs sont mis en œuvre avec votre dernière modification.
Il n'y a pas de magie, le Si vous lancez votre liste sur loadonlycollection code> il suffit d'avoir des implémentations différentes pour sa propre indexer et l'indexeur qui implémente l'interface
iList
Ilist
public T this[int index] { get { ... } }
T IList<T>.this[int index] { get { ... } set { ... } }
C'était aussi ma pensée, mais quand j'essaie que dans ma classe de classe, iliste
@ESBENP: Pour la mettre en œuvre dans une classe, la syntaxe n'est pas la même que la signature indiquée dans la documentation. Voir la modification ci-dessus.