使用双重泛型时出错

本文关键字:出错 泛型 | 更新日期: 2023-09-27 18:04:28

我有这样的类和接口:

public class BasicListViewModel<T> : ObservableObject , IListViewOperations<T>,IUpdateHandler
        where T : bre.Domein.Entity
public interface IListViewOperations<T> where T:bre.Domein.Entity
public class IngredientInVoorraad : bre.Domein.Entity

编译器对此代码给出以下错误:

参数1:无法从"bre.Presentatie.BasicListViewModel"转换为"bre.Prentatie.IListViewOperations ">

 var viewModelsPages = new List<IListViewOperations<Entity>>();
     var allIngredientsViewModel = new BasicListViewModel<IngredientInVoorraad>(()=>RepositoryFactory.getIngredientInVoorraadRepository().FindAll());
     viewModelsPages.Add(allIngredientsViewModel);  //COMPILE ERROR OCCURS HERE

我不明白为什么这不起作用:BasisListViewModel继承自IListViewOperations,IngredientInVoorraad继承自Entity。

有人能解释为什么这是错误的,以及如何在保持接口和通用性的同时修复它吗?

谢谢你帮我!

使用双重泛型时出错

您的接口IListViewOperations不是协变的。如果将接口定义设置为IListViewOperations<out T>,则接口将变为协变,并且这种转换将变为隐式。请在以下MSDN文章中进一步阅读协方差和方差:http://msdn.microsoft.com/en-us/library/ee207183.aspx

不是因为BasicListViewModel<IngredientInVoorraad>IListViewOperations<Entity>List<BasicListViewModel<IngredientInVoorraad>>才是List<IListViewOperations<Entity>>。想一想,这意味着你可以将Add任何IListViewOperations<Entity>添加到列表中,而不仅仅是一个BasicListViewModel<IngredientInVoorraad>

查找协方差。C#支持协方差,但仅适用于接口。例如,IEnumerable<BasicListViewModel<IngredientInVoorraad>就是IEnumerable<IListViewOperations<Entity>

有关更多信息,请参阅Generics 中的协方差和反方差