tengo este código simple:.NET covarianza
public interface IReader<out T>
{
IEnumerable<T> GetData();
}
Esta interfaz debe ser covariante en T, y estoy usando de esta manera:
private static Func<bool> MakeSynchroFunc<T>(IReader<T> reader) where T : IComposite
{
return() => Synchronize(reader);
}
nota la restricción de T para poner en práctica IComposite. El método de sincronización toma un IReader<IComposite>
de entrada:
private static bool Synchronize(IReader<IComposite> reader)
{
// ......
}
El compilador me dice que no se puede convertir de IReader<T>
a IReader<IComposite>
a pesar de la restricción en T y la covarianza de ireader.
¿Hay algo que esté haciendo mal aquí? El compilador debería poder verificar la restricción y la covarianza debería permitirme usar mi IReader<T>
como IReader<Icomposite>
, ¿o no?
Gracias.
¿Y si 'T' fuera una estructura? Entonces las reglas de varianza se romperían. Necesita una restricción de 'clase' para satisfacer al compilador de que será una conversión que preserva la identidad. Ver: [¿Es esto un error de covarianza en C# 4?] (Http://stackoverflow.com/questions/2783233/is-this-a-covariance-bug-inc-c-sharp-4) – Ani
sí, ese fue el problema, funciona bien ahora. gracias –
posible duplicado de [¿Por qué la covarianza no funciona con el método genérico] (http://stackoverflow.com/questions/12743444/why-covariance-does-not-work-with-generic-method) – nawfal