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 回答