C# 尽管存在约束,返回语句仍不满足泛型返回类型?

C# 尽管存在约束,返回语句仍不满足泛型返回类型?,c#,generics,interface,C#,Generics,Interface,所以我有一个返回泛型类型的方法;此方法是接口所必需的。泛型类型TOutput被约束为列表。尽管我的返回值是一个列表,但它仍然不会编译。错误仅出现在return语句中(无法转换为TOuput)。有什么想法吗 public class QueryCollectionDataSourceBase<TInput, TOutputType, TOutput> : IQueryCollectionDataSource<TInput, TOutputType, TOutput>

所以我有一个返回泛型类型的方法;此方法是接口所必需的。泛型类型TOutput被约束为列表。尽管我的返回值是一个列表,但它仍然不会编译。错误仅出现在return语句中(无法转换为TOuput)。有什么想法吗

public class QueryCollectionDataSourceBase<TInput, TOutputType, TOutput> : IQueryCollectionDataSource<TInput, TOutputType, TOutput>
    where TOutput : List<TOutputType>
{
    public virtual Func<TInput, SqlParameter[]> ParameterAdapter { get; private set; }
    public virtual Func<IDataRecord, TOutputType> ObjectAdapter { get; private set; }

    protected QueryCollectionDataSourceBase(Func<TInput, SqlParameter[]> parameterAdapter,
                                  Func<IDataRecord, TOutputType> objectAdapter)
    {
        ParameterAdapter = parameterAdapter;    
        ObjectAdapter = objectAdapter;
    }   

    public TOutput Execute(TInput request)
    {
        using (var rdr = SqlHelper.ExecuteReader(
            DatabaseConnection.ConnectionString,
            CommandType.StoredProcedure, 
            "dbo.usp_ws_act_UserByAccountIDGet", 
            ParameterAdapter(request)))
        {
            var result = new List<TOutputType>();
            while (rdr.Read())
            {
                result.Add(ObjectAdapter(rdr));
            }
            return result;
        }
    }
}

public interface IQueryCollectionDataSource<in TRequest, out TListType, out TOutput> : IQueryDataSource<TRequest, TOutput>
    where TOutput : List<TListType>
{
    Func<IDataRecord, TListType> ObjectAdapter { get; }
}
公共类QueryCollectionDataSourceBase:IQueryCollectionDataSource where-TOutput:List { 公共虚拟函数参数适配器{get;private set;} 公共虚拟Func对象适配器{get;private set;} 受保护的QueryCollectionDataSourceBase(Func参数适配器, Func对象适配器) { ParameterAdapter=ParameterAdapter; ObjectAdapter=ObjectAdapter; } 公共TOutput执行(TInput请求) { 使用(var rdr=SqlHelper.ExecuteReader)( DatabaseConnection.ConnectionString, CommandType.StoredProcess, “dbo.usp\u ws\u act\u UserByAccountIDGet”, 参数适配器(请求))) { var result=新列表(); while(rdr.Read()) { 添加(ObjectAdapter(rdr)); } 返回结果; } } } 公共接口IQueryCollectionDataSource:IQueryDataSource where-TOutput:List { Func对象适配器{get;} }
Execute
应该返回
TOutput
,但它返回的是
TOutput类型的
列表。
TOutput
被约束为
List
,但
List
不被约束为
TOutput

尝试将
结果
实例化为:

var result = new TOutput();

看看情况如何。

我认为你的诊断是正确的。但问题是,
TOutput
没有使用
new()
约束定义,因此无法以这种方式实例化它。(要么使用反射,要么稍微改变设计)为什么
TOutput
应该是它自己的类?您希望有
列表
的子类吗?是否可以将签名完全更改为dump
TOutput
,然后让方法返回一个
IEnumerable
?我实际上最初尝试过IEnumerable,但结果相同