El indexer se implementa con explícita implementación de la interfaz, por lo que sólo será capaz de acceder a él si lo hace:
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;
Por supuesto, va a fracasar después en tiempo de ejecución ...
Esto es totalmente deliberada y útil - que significa que cuando el compilador sabe es un ReadOnlyCollection
, los bits no soportadas de funcionalidad no están disponibles para usted, ayudando a desviarlo del fracaso del tiempo de ejecución.
Es un paso interesante y relativamente inusual, sin embargo, efectivamente implementando la mitad de una propiedad/indexador implícitamente, y la mitad explícitamente.
Contrariamente a mis pensamientos anteriores, creo que en realidad ReadOnlyCollection<T>
implementa todo el indexador de manera explícita, pero también proporciona un indexador pública de sólo lectura.En otras palabras, es algo como esto:
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 ...; }
}
Bien, pero ¿cómo puedo replicar la funcionalidad de ReadOnlyCollection usando la implementación explícita? No veo cómo puede eliminar un método o propiedad de la interfaz. –
@EsbenP: no se puede eliminar un método de la interfaz ... pero puede hacerlo solo disponible cuando el tipo estático de la referencia es la interfaz en lugar de la clase que implementa la interfaz. –
Ok, si tengo dos controladores paso a paso, una de ellas la implementación de IList explícitamente funciona T IList servicio [int index] { obtener { fuente de retorno [índice]; } conjunto { throw new NotImplementedException(); }} T pública esta [int index] { obtener { fuente de retorno [índice]; } } –