c# - 接口(interface)有多个泛型参数时,如何解决 "cannot implicitly convert [type] to [interface]"错误?

标签 c# generics

我有以下接口(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 类型对象的查询. IQueryHandlerHandle然后方法返回 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 to IQueryHandler<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/

相关文章:

c# - 为什么我们需要C#中的UI,业务和数据访问之间的接口(interface)

c# - 将 Visual Studio 2008 项目转换为 2003

C# 不使用额外内存的对象顺序列表

c# - 在 ASP.NET 中重写 URL?

java - 所有变体方法重写

c# - 表达式<Action<T>> 方法调用

c# - 是否可以在同一个 T 上使用通用的 "in"和 "out"修饰符?

c# - 使用受约束泛型类型 C# 的静态方法

c# - 如何将数据强制转换为方法约束中指定的泛型?

Java Map,其中值是与键类型相同的值列表