泛型类型的转换
本文关键字:转换 泛型类型 | 更新日期: 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;
}