我有以下类结构:
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 );
但根据转换仍然会得到类似的错误。 那么我应该申请什么样的转换才能归还呢?
答案 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;
}