我环顾四周,并没有发现任何与我的问题完全相符的东西,尽管this确实很接近。基本上,我有一个页面对象的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)类或CategoryList类中使用CategoryList。
我该如何制作这个work...or呢?我尝试了类似的方法,我在上面链接的问题中建议,但我什么也找不到工作。谢谢!
发布于 2014-02-26 09:38:53
您的问题是PageList<Page>和PageList<Category>并不是协变的。这些实际上是完全无关的类型。即使T是派生类型,结果的泛型集合也不是。
如果您想一想,这是正确的,因为否则没有什么可以阻止您将CatagoryList传递给一个期望PageList的函数,该函数可以将一个Page添加到无效的可怕集合中。
为了帮助解决这种情况,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)
{
}https://stackoverflow.com/questions/22036210
复制相似问题