繁体   English   中英

无法隐式转换类型&#39;System.Collections.Generic.List <MyProduct> &#39;到&#39;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是objectString怎么办? 返回MyProduct的列表将非常混乱,并且几乎肯定会在尝试进行强制转换时失败(就像您的“工作”代码一样)。 换句话说,如果您始终返回List<MyProduct> ,为什么还要打扰泛型(因此,我前面的评论中,它们都必须是泛型的,或者全部都是具体的,您不能混用!)。

泛型的一般规则是“ T是object ”。 这就是全部,所有可能的一切。 如果您不仅需要object ,还需要更多的专业化,则需要where泛型类型参数中添加where子句。 我有点怀疑在这种情况下您实际上是否需要这样做,因为您看起来好像只是在进行Web请求。 您应该可以将功能更改为:

List<T> GetProducts

此时,您可能还想考虑使类通用,但这取决于您。 如果您无法进行更改,那么我将从您的方法中删除泛型。 您可以打开oF T类型,但这并没有什么好处,而且很难理解/阅读。

通用类型约束的MSDNwhere ): MSDN

请让我知道是否可以澄清任何事情!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM