he decidido recientemente para refrescar mi memoria en relación con conceptos básicos de C#, por lo que este podría ser trivial, pero he tropezaron con el problema siguiente:interfaces de C# Covarianza y contravarianza al implementar
StringCollection
se utilizó en v1 .NET 0.0 con el fin de crear una colección con establecimiento inflexible para cuerdas en lugar de un object
basado ArrayList
(esto más tarde se mejoró mediante la inclusión de colecciones genéricas):
Tomando una mirada rápida a StringCollection
definición, se puede ver lo siguiente:
// Summary:
// Represents a collection of strings.
[Serializable]
public class StringCollection : IList, ICollection, IEnumerable
{
...
public int Add(string value);
...
}
Se puede ver que implementa IList
, que contiene la siguiente declaración (entre algunas otras declaraciones):
int Add(object value);
Pero no:
int Add(string value);
Mi primera suposición fue que es posible debido a las reglas de covarianza de .NET framework.
lo tanto, sólo para asegurarse, he intentado escribir mi propia clase que implementa IList
y cambió
int Add(object value);
para recuperar un tipo de cadena en lugar de un tipo de objeto, pero para mi sorpresa, cuando se trata de compilar el proyecto , Tengo un error en tiempo de compilación:
does not implement interface member 'System.Collections.IList.Add(object)'
¿Alguna idea de por qué?
Gracias!
Entonces, ¿debo recordar que, como regla general, la implementación explícita de una interfaz NO aparece en las definiciones de clases incorporadas en las librerías .NET? (porque obviamente no puedo ver esta implementación entre todos los métodos en la clase StringCollection) ¿Por qué? –
Por lo general, en efecto, similar al sombreado de miembros: enmendé la respuesta para abordar esto. – drf