我有以下接口(interface):
public interface IQueryHandler<in TQuery, out TResult> where TResult : class
where TQuery : IQuery<TResult>
{
TResult Handle(TQuery query);
}
public interface IQuery<TResult> // Doesn't require anything special, just used to guarantee that IQueryHandlers get the right parameters.
{
}
它旨在被 IQueryHandlers
使用这将接受 IQuery<TResult>
它定义了一个返回 TResult
类型对象的查询. IQueryHandler
的 Handle
然后方法返回 TResult
.
我在 DataQueryHandlers
上实现了接口(interface)类:
public class DataQueryHandlers : IQueryHandler<GetDataById, SomeData>
{
private IDataSource source;
public DataQueryHandlers(IDataSource source)
{
this.source = source
}
public SomeData Handle(GetDataById query)
{
// Get the data here and return SomeData object
}
}
哪里SomeData
是一个数据实体,GetDataById
是一个 IQuery<SomeData>
但是,当我尝试实例化特定实例时:
private IQueryHandler<IQuery<SomeData>, SomeData> dataQueryHandlers;
private IDataSource source;
source = new DataSource(); // some data provider
dataQueryHandlers = new DataQueryHandlers(datasource); // This line won't compile
我得到一个编译器错误:
Cannot implicitly convert type
DataQueryHandlers
toIQueryHandler<IQuery<SomeData>, SomeData>
. An explicit conversion exists (are you missing a cast?)
我确定这是一个与协变/逆变相关的问题,但我看不出哪里不匹配。我的输入/输出通用修饰符有问题吗?我想做的事情在某种程度上是根本不正确的吗?我是否遗漏了一些明显的“hair on a fish”场景?
最佳答案
您应该将派生类更改为通用类才能执行此操作。 将其更改为:
public class DataQueryHandlers<in TQuery, out TResult> : IQueryHandler<TQuery, TResult> where TResult : class where TQuery : IQuery<TResult>
{
private IDataSource source;
public DataQueryHandlers(IDataSource source)
{
this.source = source
}
public TResult Handle(TQuery query)
{
// Get the data here and return TResult object
}
}
有关泛型类的更多信息,您可以找到 MSDN
关于c# - 接口(interface)有多个泛型参数时,如何解决 "cannot implicitly convert [type] to [interface]"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43920195/