2010-11-10 10 views
6

Tengo dos interfaces:C# herencia en los genéricos cuestionar

public interface A { 
void aMethod(); 
} 


public interface B : A { 
void bMethod(); 
} 

después estoy básicamente utilizando un diccionario de esta manera:

Dictionary<int, A> dict = new Dictionary<int, B>(); 

C# está diciendo que no puedo convertir de derecho a la izquierda, incluso si la lanzo. ¿Hay alguna manera de usar genéricos en C# para que esto funcione? Si los convierto en clases abstractas, parece que está bien, pero los necesito como interfaces.

+1

¿Qué versión de .NET estás usando? – Dinah

+0

@Dinah: ¿Por qué la versión de framework haría alguna diferencia en este caso? – LukeH

+0

@LukeH: porque .NET 4.0 tiene covarianza y contravariancia que pueden abordar esto. Si dmurph está teniendo este problema a pesar de estar en 4.0, el problema sería diferente de si el problema ocurrió antes de 4.0 – Dinah

Respuesta

7

No, es un problema de covarianza. Si pudiera:

Dictionary<int, A> dict = new Dictionary<int, B>(); 

Sería posible sin un error de compilación poner un objeto de tipo A en dict.

El problema es que parece que dict: Dictionary<int, A> pero realmente es de tipo Dictionary<int, B>() (a fin de colocar un objeto de tipo A lanzaría un error de ejecución debido a un reparto no válido), por lo que no se debe permitir incluso a tratar de colocar un objeto de tipo a en dict, por lo que no se puede hacer:

Dictionary<int, A> dict = new Dictionary<int, B>(); 

te está protegiendo de cometer un error en tiempo de ejecución.
desea comprobar el blog de Eric Lippert sobre el tema: http://blogs.msdn.com/b/ericlippert/

Es uno de sus temas favoritos que hablar, por lo que es bastante completo.

+0

¡gracias por el enlace del blog!esto tiene sentido –

0

No creo que encuentres una forma de evitar tu problema porque la idea detrás de esto parece defectuosa. Para ilustrar esto, vamos a crear otra interfaz:

public interface C : A 
{ 
    void cMethod(); 
} 

Ahora, vamos a usar el código:

Dictionary<int, A> dict = new Dictionary<int, B>(); 

lo que sucede cuando lo intento el siguiente?

C c = new ClassThatImplementsC(); 
dict.Add(1, c); 

Tome un vistazo a Eric Lippert's Covariance and Contravarience FAQ por muchos, muchos más detalles.

+1

Eso es en realidad las preguntas frecuentes de Alexandra; Solo lo edité. –

+0

esto también tiene mucho sentido, gracias –