Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
实现公共接口的类中的C#协方差_C#_Covariance - Fatal编程技术网

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

实现公共接口的类中的C#协方差,c#,covariance,C#,Covariance,我用C语言编写的WPF程序在后端有以下接口: public interface CatalogMenu<T> : CatalogItem where T : CatalogItem { void AddCatalogItem(T toAdd); void RemoveCatalogItem(T toRemove); List<T> AvailableCatalogItems { get; } } 公共界面CatalogMenu:CatalogI

我用C语言编写的WPF程序在后端有以下接口:

public interface CatalogMenu<T> : CatalogItem where T : CatalogItem
{
    void AddCatalogItem(T toAdd);
    void RemoveCatalogItem(T toRemove);

    List<T> AvailableCatalogItems { get; }
}
公共界面CatalogMenu:CatalogItem其中T:CatalogItem
{
作废添加目录项(T至添加);
无效清除催化剂(T toRemove);
列出可用的计算项{get;}
}
我有三个实现接口的类,每个类都有不同的T。问题是我想创建一个
列表
来绑定到一个ListView,但是视图模型中的这个属性没有编译。。。(thing1、thing2和thing3都使用不同的T实现接口)

公共列表菜单类别
{
得到
{
返回新列表(){
ModuleCatalog.thing1,
ModuleCatalog.thing2,
ModuleCatalog.thing3
};
}
}
尽管我很想这样做,但编译器不允许我将“实现
CatalogMenu
的类,其中t是CatalogEntity”视为“
CatalogMenu
”。我想通过一个公共接口向用户展示实现该接口的每个类


如果我遗漏了任何细节,请对我耐心一点;在过去的30分钟里,我一直在阅读有关协变性的文章,试图找出解决这个问题的方法。Net不支持协变类

如果您添加一个
iCalogMenu
,您将能够将任何目录菜单强制转换为
iCalogMenu
,并将其放入
列表中


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

您是否尝试过简单地强制转换
return new List(){(CatalogMenu)ModuleCatalog.ting1}
?out参数允许我将ICatalogMenu强制转换为ICatalogMenu,但我不能在add和remove方法中将type参数用作方法参数,我的许多代码都依赖于这两个方法。我希望使用非泛型接口,但使用非泛型接口可以使在代码的其他地方根据对象的特定类型序列化对象变得更容易。基本上,如果我不使用泛型类,我必须在这一点上重写大部分程序:(@Quanta:如果您的类型参数用作参数类型,那么您试图做的实际上不是类型安全的。
public List<CatalogMenu<CatalogItem>> MenuCategories
    {
        get
        {
            return new List<CatalogMenu<CatalogItem>>(){
                ModuleCatalog.thing1, 
                ModuleCatalog.thing2, 
                ModuleCatalog.thing3 
            };
        }
    }