我环顾四周,没有找到与我的问题完全匹配的内容,尽管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/