c# – 类型不能在泛型类型或方法’BaseController’中用作类型参数’T’.没有隐含的参考
作者:互联网
我正在尝试创建一个通用来简化我的代码(它是一个web api项目),但不知何故它最终变得比我预期的更复杂.我想要实现的是这样的:
为了简化我的整个实际代码,这就是我写的:
public interface IDatabaseTable { }
public class ReceiptIndex: IDatabaseTable { }
public interface IBackend<T> where T: IDatabaseTable { }
public class Receipts : IBackend<ReceiptIndex> { }
public class Generic<T> : SyncTwoWayXI, IBackend<T> where T:IDatabaseTable { }
public class BaseController<T> : ApiController where T: IBackend<IDatabaseTable>, new () { }
上面的所有行都在其自己的文件中单独创建.
当我尝试创建从BaseController继承的控制器
public class ReceiptsBaseController : BaseController<Receipts>
我得到一个错误说
The type ‘Receipts’ cannot be used as type parameter ‘T’ in the
generic type or method ‘BaseController’. There is no implicit
reference conversion from ‘Receipts’ to ‘IBackend’.
我试图找到一个类似的问题,并最终得到一个称为协方差和逆变问题的东西.任何人都可以为我正在尝试做的事情提供反馈,或者我可以做些什么来简化它.
解决方法:
您可以尝试在IBackend中指定T.
像这样:
public class BaseController<T, TBackEndSubType> : ApiController
where T : IBackend<TBackEndSubType>, new()
where TBackEndSubType : IDatabaseTable { }
public class ReceiptsBaseController : BaseController<Receipts, ReceiptIndex> { }
标签:c,inheritance,covariance,contravariance,generics 来源: https://codeday.me/bug/20190609/1204839.html