我环顾四周并没有找到任何与我的问题完全匹配的东西,尽管this肯定很接近。基本上,我有一个Page对象的KeyedCollection作为基础,我希望强类型的派生对象集合来自它。具体来说,我有:
public class Page
public class Category : Page
public class PageList<T> : KeyedCollection<string, T> where T : Page
public class CategoryList : PageList<Category>
现在,这似乎很好,直到我想使用PageList<T>
之类的DoSomethingTo(this)
来调用DoSomethingTo(PageList<Page> pageList)
内的方法,该方法当前被声明为DoSomething(this)
。这给了我一个投射错误。
我希望能够做到的是,您可能已经想到的是在PageList<T>
类或中使用{{1}} CategoryList类。
我如何做这项工作......或者我呢?我尝试过与上面链接的问题中提出的方法类似的方法,但我无法得到任何工作。谢谢!
答案 0 :(得分:1)
您的问题是PageList<Page>
和PageList<Category>
不是协变的。这些是完全不相关的类型。即使T是派生类型,生成的泛型集合也不是。
如果您考虑一下,这是正确的,因为否则就没有什么可以阻止您将CatagoryList
传递给期望PageList
然后可以添加Page
的函数对于无效的catagory集合。
为了帮助解决这类问题,C#4增加了对协变接口的支持。通过使用输入和输出关键字限制您可以执行的操作,这些允许有限的协方差。
您的关联问题使用了这个,您也可以这样做。
interface IPageList<out T> where T : Page
{
}
public class PageList<T> : KeyedCollection<string, T>, IPageList<T> where T : Page
{
}
DoSomethingTo(IPageList<Page> pageList)
{
}