泛型类型的转换

本文关键字:转换 泛型类型 | 更新日期: 2023-09-27 18:36:44

我有以下类结构:

public class FirstContextController : AFirstContextController
public abstract class AFirstContextController : ABaseController<AFirstContextView>
public abstract class ABaseController<TView> where TView : ABaseView
public abstract class AFirstContextView : ABaseContextView
public abstract class ABaseContextView : ABaseView
public abstract class ABaseView : UserControl

现在我创建控制器的实例:

AFirstContextController firstContextController = new FirstContextController();

并且需要从方法中返回它:

public static ABaseController<ABaseContextView> GetContextController( ... )
{
    return firstContextController;
}

但是后来我得到一个错误:

无法将类型"AFirstContextController"隐式转换为"ABaseController"

所以我尝试了许多选角(例如):

return (ABaseController<AFirstContextView>)firstContextController;
return (ABaseController<ABaseContextView>)( (ABaseController<AFirstContextView>)firstContextController );

但根据转换仍然会出现类似的错误。那么我应该应用什么转换来退货呢?

泛型类型的转换

你需要一个派生自ABaseController<ABaseContextView>的接口才能使其工作。

这与方差和协方差有关。Reed 更多关于 MSDN 的信息:泛型中的协方差和逆变。

您必须在接口定义中使用out标记ABaseContextView,因此签名应类似于 IBaseController<out ABaseContextView> .

例:

public abstract class ABaseController<TView> : IBaseController<TView> where TView : ABaseView
{
    public void SomeMethod() { }
}

和界面:

public interface IBaseController<out TView> where TView : ABaseView
{
    void SomeMethod();
}

然后,您当前的方法应为:

public static IBaseController<ABaseContextView> GetContextController( ... )
{
    return firstContextController;
}