3

ジェネリックを使用した継承の設定に問題があります。

本質的に、私がやりたいことは、それ自体がインターフェースを受け入れる汎用インターフェースを持つことです。トリッキーな部分は、「内部」インターフェースが、その上にレイヤー化されたより具体的なインターフェースを持つことができるということです。

これは、私が構築しようとしている構造の代表的なサンプルです。

public interface IThing  { }

public interface IMoreSpecificThing : IThing  {  }

public interface IWidget<T> where T : IThing  {  }

public class MySpecificThing : IMoreSpecificThing { }

public class MyWidget : IWidget<MySpecificThing> { }

public class MyClass
{
    public IWidget<IThing> MyProperty { get; set; }

    public MyClass()
    {
        MyProperty = new MyWidget();
    }
}

問題は、MyWidget を MyProperty に割り当てると、次のエラーが表示されることです。

'MyWidget'タイプを に暗黙的に変換することはできません'IWidget<IThing>'。明示的な変換が存在します (キャストがありませんか?)

これを正しく行う方法はありますか?

4

1 に答える 1

11

これには、インターフェースを共変にする必要があります。

public interface IWidget<out T> where T : IThing  {  }

詳細については、ジェネリックにおける共分散と反分散を参照してください。これにより、主にインターフェースに制限が課されることに注意してください。

これらのインターフェイスのすべての型パラメーターは共変であるため、型パラメーターはメンバーの戻り値の型にのみ使用されます。

于 2013-09-30T18:01:10.803 に答える