C# 中的泛型继承:无法将类型“MyWidget”隐式转换为“IWidget”

本文关键字:MyWidget IWidget 转换 类型 泛型 继承 | 更新日期: 2023-09-27 18:33:17

我在设置泛型继承时遇到问题。

从本质上讲,我想做的是拥有一个本身接受接口的通用接口。 棘手的部分是"内部"接口可以在其上分层一个更具体的接口。

以下是我尝试构建的结构的代表性示例:

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>' 。一 存在显式转换(您是否缺少强制转换?

我做错了什么,有没有办法正确地做到这一点?

C# 中的泛型继承:无法将类型“MyWidget”隐式转换为“IWidget”

这需要使接口协变:

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

有关详细信息,请参阅泛型中的协方差和逆变。 请注意,这确实对接口施加了限制,主要是:

这些接口的所有类型参数都是协变的,因此类型参数仅用于成员的返回类型。