通用类型的转换

Conversion of generic types

我有以下 class 结构:

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();

并且需要从方法return它:

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

但是我得到一个错误:

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

所以我尝试了很多铸造(例如):

return (ABaseController<AFirstContextView>)firstContextController;

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

但是根据转换还是会出现类似的错误。 那么我应该对 return 应用什么转换?

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

这与方差和协方差有关。在 MSDN: Covariance and Contravariance in Generics.

上了解更多信息

您必须在接口定义中用 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;
}