C# 尽管存在约束,返回语句仍不满足泛型返回类型?
所以我有一个返回泛型类型的方法;此方法是接口所必需的。泛型类型TOutput被约束为列表。尽管我的返回值是一个列表,但它仍然不会编译。错误仅出现在return语句中(无法转换为TOuput)。有什么想法吗C# 尽管存在约束,返回语句仍不满足泛型返回类型?,c#,generics,interface,C#,Generics,Interface,所以我有一个返回泛型类型的方法;此方法是接口所必需的。泛型类型TOutput被约束为列表。尽管我的返回值是一个列表,但它仍然不会编译。错误仅出现在return语句中(无法转换为TOuput)。有什么想法吗 public class QueryCollectionDataSourceBase<TInput, TOutputType, TOutput> : IQueryCollectionDataSource<TInput, TOutputType, TOutput>
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
应该是它自己的类?您希望有列表
的子类吗?是否可以将签名完全更改为dumpTOutput
,然后让方法返回一个IEnumerable
?我实际上最初尝试过IEnumerable,但结果相同