通用类型的转换
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;
}
我有以下 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;
}