我用C#编写的WPF程序在后端有以下界面:
public interface CatalogMenu<T> : CatalogItem where T : CatalogItem
{
void AddCatalogItem(T toAdd);
void RemoveCatalogItem(T toRemove);
List<T> AvailableCatalogItems { get; }
}
我有三个实现接口的类,每个类都有不同的T.问题是我想创建一个List<CatalogMenu<CatalogItem>>
来绑定到ListView,但View-Model中的这个属性不能编译...(thing1,thing2和thing3都使用不同的T实现接口)
public List<CatalogMenu<CatalogItem>> MenuCategories
{
get
{
return new List<CatalogMenu<CatalogItem>>(){
ModuleCatalog.thing1,
ModuleCatalog.thing2,
ModuleCatalog.thing3
};
}
}
根据我的意愿,编译器不会让我将“T为CatalogEntity的实现CatalogMenu<T>
的类”视为“CatalogMenu<CatalogItem>
”。我想通过一个通用接口向用户展示实现接口的每个类。
如果我遗漏任何细节,请对我有点耐心;在读完过去30分钟的协方差后试图找出解决这个问题的方法后,我脑子里的意大利面。
答案 0 :(得分:2)
.Net不支持协变类。
如果您添加ICatalogMenu<out T>
,则可以将任何CatalogMenu投射到ICatalogMenu<CatalogItem>
并将其放入List<ICatalogMenu<CatalogItem>>
您可以使用普通的非泛型接口或基类来实现相同的效果。