7

このコード例を短くしてみます。

public interface IThing
{
    //...  Stuff
}

public class Thing1 : IThing
{  
}

public class Thing2 : IThing
{  
}

public interface IThingView<out T>
{
    ICollection<T> ViewAll();
}

public class ThingView<T> : IThingView<T>
{
    ICollection<T> ViewAll() { return new List<T>(); }  //  There's a big operation here
}

public interface IThingViewerFactory
{
    public IThingView<IThing> Build(string Which);
}

public class ThingViewerFactory
{
    public IThingView<IThing> Build(string Which)
    {
        if(Which.Equals("Thing1") { return new (IThingView<IThing>)new ThingViewer<Thing1>();}
        else { return new (IThingView<IThing>)new ThingViewer<Thing2>();}
    }
}

それは私がしていることの大まかな考えです。comonインターフェースに従うビューアを必要とするThingクラスがいくつかあります。名前の付いた文字列を渡して、これらを生成するファクトリが欲しいのですが。コンパイラエラーが発生し続けます:

無効な差異:タイプパラメータ「T」は、「IThingView.ViewAll()」で常に有効である必要があります。「T」は共変です。

これが機能しても、後でキャストする必要があることに気づきました...それで大丈夫です。そして、私はこのアプローチがおそらく必要ではないことを理解しています。この時点で、これはプライド/好奇心の問題になっています。

ありがとう!

4

2 に答える 2

11

ICollection<T>sを入れることができるので、共変量を作成することはできませんT

共変の読み取り専用コレクション、反変の書き込み専用コレクション、または不変の読み取り/書き込みコレクションを作成できます。
両方を行うことはできません。そうしないと、タイプセーフになりません。

于 2011-05-26T17:45:35.080 に答える
6

SLaksの答えを拡張するには:
コードをコンパイルするには、戻り値のタイプをViewAllからICollection<T>に変更しIEnumerable<T>ます。

于 2011-05-26T17:50:37.777 に答える