实现公共接口的类中的C#协方差

本文关键字:方差 接口 实现 | 更新日期: 2023-09-27 18:24:09

我用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 
            };
        }
    }

尽管我很希望它,但编译器不允许我将"实现CatalogMenu<T>的类,其中t是CatalogEntity"视为"CatalogMenu<CatalogItem>"。我想通过一个公共接口将实现接口的每个类呈现给用户。

如果我遗漏了任何细节,请耐心等待;在过去的30分钟里,我读到了关于协方差的文章,试图找出解决这个问题的方法。

实现公共接口的类中的C#协方差

.Net不支持协变

如果添加ICatalogMenu<out T>,则可以将任何CatalogMenu强制转换为ICatalogMenu<CatalogItem>并将其放入List<ICatalogMenu<CatalogItem>>

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