我很生气,因为我想从另一种通用方法中调用泛型方法。
这是我的代码:
public List<Y> GetList<Y>(
string aTableName,
bool aWithNoChoice)
{
this.TableName = aTableName;
this.WithNoChoice = aWithNoChoice;
DataTable dt = ReturnResults.ReturnDataTable("spp_GetSpecificParametersList", this);
//extension de la classe datatable
List<Y> resultList = (List<Y>)dt.ToList<Y>();
return resultList;
}
所以实际上当我调用ToList时,他是DataTable类的扩展(学习Here)
编译器说Y不是非抽象类型,他不能将它用于.ToList&lt;&gt;通用方法..
我做错了什么?
感谢您阅读..
答案 0 :(得分:11)
将方法签名更改为:
public List<Y> GetList<Y>(
string aTableName,
bool aWithNoChoice) where Y: new()
您需要的原因是因为您使用的自定义扩展方法对其泛型类型参数强加了new()
约束。它当然需要,因为它创建了这种类型的实例来填充返回的列表。
显然,您还必须使用泛型类型参数调用此方法,该参数表示具有公共无参数构造函数的非抽象类型。
答案 1 :(得分:5)
听起来你需要:
public List<Y> GetList<Y>(
string aTableName,
bool aWithNoChoice) where Y : class, new()
{ ... }
答案 2 :(得分:4)
看起来ToList函数对类型有一个约束:
where T : new()
我认为如果你对你的函数使用相同的约束(但使用Y
而不是T
),它应该有效。
您可以在此处详细了解:http://msdn.microsoft.com/en-us/library/sd2w2ew5(v=VS.80).aspx
答案 3 :(得分:1)
我猜你需要使用where子句约束你的泛型类型。