![](/img/trans.png)
[英]Cannot Implicitly convert type 'System.Collections.Generic.list<fooClass>' to 'System.Collections.Generic.List<T>
[英]Cannot implicitly convert type 'System.Collections.Generic.List<MyProduct>' to 'System.Collections.Generic.List<T>
我的应用程序使用
var results= websiteDetail.Detail.GetProductDetails<MyProduct>(code, websiteDetail.Detail.NegativeWords);
现在依次调用
public List<T> GetProductDetails<T>(string websiteHtmlCode, List<string> negativeWords)
{
List<T> result = new List<T>();
foreach (var item in GetProducts(negativeWords))
{
result.Add((T)Convert.ChangeType(item, typeof(T)));
}
return result;
}
private List<MyProduct> GetProducts(List<string> negativeWords)
{
// logic
}
但是,如果我将代码更新为:
public List<T> GetProductDetails<T>(string websiteHtmlCode, List<string> negativeWords)
{
return GetProducts(negativeWords); //ERROR
}
我被告知:
无法将类型
'System.Collections.Generic.List<MyProduct>'
隐式转换为'System.Collections.Generic.List<T>
然后,我更新了代码,以删除用于单个对象的列表,同样的问题仍然存在。
为什么当T已经是该类型时,为什么必须调用ListConvert.ChangeType?
这里的问题在于理解C#泛型的工作方式。
在C ++中,存在模板专门化的概念。 也就是说,您可以编写:
void Foo<T> {}
void Foo<int> {}
如果T是一个int,它将使用专用版本,否则将使用通用版本。 C#泛型中不允许这样做。 要么一切都是通用的,要么不是。 当你写
public List<T> GetProductDetails<T>(string websiteHtmlCode, List<string> negativeWords)
您现在处在泛型之地(尽管是泛型方法而不是类)。 由于您现在处于泛型领域,因此请调用特定函数:
List<MyProduct> GetProducts
没有任何意义。 如果T是object
或String
怎么办? 返回MyProduct
的列表将非常混乱,并且几乎肯定会在尝试进行强制转换时失败(就像您的“工作”代码一样)。 换句话说,如果您始终返回List<MyProduct>
,为什么还要打扰泛型(因此,我前面的评论中,它们都必须是泛型的,或者全部都是具体的,您不能混用!)。
泛型的一般规则是“ T是object
”。 这就是全部,所有可能的一切。 如果您不仅需要object
,还需要更多的专业化,则需要where
泛型类型参数中添加where
子句。 我有点怀疑在这种情况下您实际上是否需要这样做,因为您看起来好像只是在进行Web请求。 您应该可以将功能更改为:
List<T> GetProducts
此时,您可能还想考虑使类通用,但这取决于您。 如果您无法进行更改,那么我将从您的方法中删除泛型。 您可以打开oF T类型,但这并没有什么好处,而且很难理解/阅读。
请让我知道是否可以澄清任何事情!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.