9

私はこの単純なコードを持っています:

public interface IReader<out T>
{
    IEnumerable<T> GetData();
}

このインターフェースはTで共変である必要があり、私はこのように使用しています:

private static Func<bool> MakeSynchroFunc<T>(IReader<T> reader) where T : IComposite
{
    return () => Synchronize(reader);
}

TがICompositeを実装するための制約に注意してください。同期メソッドはIReader<IComposite>入力を受け取ります:

private static bool Synchronize(IReader<IComposite> reader)
{
    // ......
}

コンパイラーは、Tの制約とIReaderの共分散にもかかわらず、からIReader<T>に変換できないと言っています。IReader<IComposite>

ここで私が間違っていることはありますか?コンパイラーは制約を検証できるはずであり、共分散は私IReader<T>をとして使用させてくれるはずですよIReader<Icomposite>ね?

ありがとう。

4

3 に答える 3

5

classに制約を追加することで、問題を解決できるはずですT。構造体が含まれている場合、共分散は機能しません(IEnumerable<int>に変換できませんIEnumerable<object>)。Tクラスになるように制約されていないのでIReader<some struct that implements IComposite>、変換できない、を渡すことができます。

于 2012-06-20T13:15:54.453 に答える
1

残念ながら違います。ジェネリックは共変ではありません。IReader<T>に関連しているIReader<IComposite>にもかかわらず、完全に無関係なタイプです。TIComposite

編集:なぜこれが.Net4とで機能しないのかわかりません<out T>。他の誰かが答えることができますか?

于 2012-06-20T12:28:47.327 に答える
0

関数の定義を変更してみませんか。これが本当に必要なものだからです。

private static Func<bool> MakeSynchroFunc<T>(IReader<IComposite> reader) where T : IComposite

他のものにはジェネリックパラメーターTが必要かもしれないので、そのままにしておきました。

于 2012-06-20T12:30:08.330 に答える