ho questo semplice codice:.NET covarianza
public interface IReader<out T>
{
IEnumerable<T> GetData();
}
Questa interfaccia deve essere covariante su T, e sto usando in questo modo:
private static Func<bool> MakeSynchroFunc<T>(IReader<T> reader) where T : IComposite
{
return() => Synchronize(reader);
}
Nota il vincolo per T implementare IComposite. Il metodo di sincronizzazione prende un IReader<IComposite>
in ingresso:
private static bool Synchronize(IReader<IComposite> reader)
{
// ......
}
Il compilatore mi dice che non può convertire IReader<T>
-IReader<IComposite>
nonostante il vincolo sulla T e la covarianza di iReader.
C'è qualcosa che sto facendo male qui? Il compilatore dovrebbe essere in grado di verificare il vincolo e la covarianza dovrebbe lasciarmi usare il mio IReader<T>
come IReader<Icomposite>
, non è vero?
Grazie.
E se "T" fosse una struttura? Quindi le regole di varianza sarebbero rotte. È necessario un vincolo 'class' per soddisfare il compilatore che sarà una conversione che preserva l'identità. Vedi: [Si tratta di un bug di covarianza in C# 4?] (Http://stackoverflow.com/questions/2783233/is-this-a-covariance-bug-in-c-sharp-4) – Ani
sì, quello era il problema, ora funziona bene. grazie –
possibile duplicato di [Perché la covarianza non funziona con il metodo generico] (http://stackoverflow.com/questions/12743444/why-covariance-does-not-work-with-generic-method) – nawfal