实现通用接口的类中的C#协方差

时间:2012-02-13 02:32:50

标签: c# covariance

我用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分钟的协方差后试图找出解决这个问题的方法后,我脑子里的意大利面。

1 个答案:

答案 0 :(得分:2)

.Net不支持协变

如果您添加ICatalogMenu<out T>,则可以将任何CatalogMenu投射到ICatalogMenu<CatalogItem>并将其放入List<ICatalogMenu<CatalogItem>>

您可以使用普通的非泛型接口或基类来实现相同的效果。