Mam ten prosty kod:NET kowariancji
public interface IReader<out T>
{
IEnumerable<T> GetData();
}
Interfejs ten należy kowariantna na T, i używam go w ten sposób:
private static Func<bool> MakeSynchroFunc<T>(IReader<T> reader) where T : IComposite
{
return() => Synchronize(reader);
}
Uwaga ograniczenie dla T do wdrożenia IComposite. Metoda synchronizacji trwa IReader<IComposite>
na wejściu:
private static bool Synchronize(IReader<IComposite> reader)
{
// ......
}
Kompilator mówi mi, że nie można przekonwertować z IReader<T>
do IReader<IComposite>
pomimo ograniczenia na T i kowariancji iReader.
Czy jest coś, co robię źle tutaj? Kompilator powinien być w stanie zweryfikować ograniczenie, a kowariancja powinna pozwolić mi używać mojego IReader<T>
jako IReader<Icomposite>
, czyż nie?
Dzięki.
Co jeśli 'T' jest strukturą? Wtedy zasady wariancji zostaną zerwane. Aby przekonać kompilator, że będzie to konwersja zachowująca tożsamość, potrzebne jest ograniczenie "class". Zobacz: [Czy jest to błąd kowariancji w C# 4?] (Http://stackoverflow.com/questions/2783233/is-this-a-covariance-bug-in-c-sharp-4) – Ani
tak, to było problem, teraz działa dobrze. dziękuję –
możliwy duplikat [Dlaczego kowariancja nie działa z metodą ogólną] (http://stackoverflow.com/questions/12743444/why-covariance-does-notwork-z-generic-method) – nawfal