泛型类型的转换

时间:2015-01-07 09:41:39

标签: c# .net

我有以下类结构:

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

但根据转换仍然会得到类似的错误。 那么我应该申请什么样的转换才能归还呢?

1 个答案:

答案 0 :(得分:4)

您需要一个派生自ABaseController<ABaseContextView>的界面才能使其正常运行。

这与方差和协方差有关。在MSDN: Covariance and Contravariance in Generics上更多地了解它。

您必须在接口定义中使用ABaseContextView标记out,因此签名应该类似于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;
}