我环顾四周,没有找到与我的问题完全匹配的内容,尽管this当然很接近。基本上,我有一个Page对象的KeyedCollection作为基础,并且我希望派生自此对象的强类型集合。具体来说,我有:

public class Pagepublic class Category : Pagepublic class PageList<T> : KeyedCollection<string, T> where T : Pagepublic class CategoryList : PageList<Category>

现在,这看起来还不错,直到我想使用PageList<T>之类的东西从DoSomethingTo(this)中调用一个方法,该方法当前声明为DoSomethingTo(PageList<Page> pageList)。这给了我一个转换错误。

正如您可能已经知道的,我想做的是从DoSomething(this)类或CategoryList类中使用PageList<T>

我该如何进行这项工作...还是?我尝试了与上面链接的问题中建议的方法类似的方法,但无法进行任何工作。谢谢!

最佳答案

您的问题是PageList<Page>PageList<Category>不协变。实际上是完全不相关的类型。即使T是派生类型,生成的泛型集合也不是。

如果您考虑一下,这是正确的,因为否则,没有什么会阻止您将CatagoryList传递给期望PageList的函数,该函数随后会将Page添加到类别集合中,这将是无效的。

为了帮助解决这种情况,C#4添加了对协变接口的支持。这些通过使用in和out关键字来限制您可以执行的操作,从而实现有限的协方差。

您的链接问题使用了此方法,您也可以这样做。

interface IPageList<out T> where T : Page
{
}

public class PageList<T> : KeyedCollection<string, T>, IPageList<T> where T : Page
{
}


DoSomethingTo(IPageList<Page> pageList)
{
}

关于c# - 派生类的通用KeyedCollection,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22036210/

10-12 04:13