编程语言
首页 > 编程语言> > c# – 类型不能在泛型类型或方法’BaseController’中用作类型参数’T’.没有隐含的参考

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