私はこの単純なコードを持っている:.NET共分散
public interface IReader<out T>
{
IEnumerable<T> GetData();
}
このインタフェースは、Tに共変しなければならない、と私はそれをこのように使用しています:Tのための制約を実装するため
private static Func<bool> MakeSynchroFunc<T>(IReader<T> reader) where T : IComposite
{
return() => Synchronize(reader);
}
注意をIComposite。 同期方法は、入力にIReader<IComposite>
を取ります
private static bool Synchronize(IReader<IComposite> reader)
{
// ......
}
コンパイラは、それがT上の制約とIReaderの共分散にもかかわらず、IReader<IComposite>
へIReader<T>
から変換することはできませんと言われます。
私はここで間違っていますか? コンパイラは制約を確認できなければなりません。共分散は私がIReader<T>
をIReader<Icomposite>
として使用しなければならないでしょうか?
ありがとうございました。
'T 'が構造体の場合はどうなりますか?そうすれば、分散ルールが破られます。コンパイラがアイデンティティを保持する変換となるようにするには、 'class'制約が必要です。参照:[これはC#4の共分散バグですか?](http://stackoverflow.com/questions/2783233/is-this-a-covariance-bug-in-c-sharp-4) – Ani
はい、それは問題は、それは今うまく動作します。ありがとうございます –
の可能な複製[なぜ共分散は一般的な方法で動作しません](http://stackoverflow.com/questions/12743444/why-covariance-does-not-work-with-generic-method) – nawfal