使用双重泛型时出错
本文关键字:出错 泛型 | 更新日期: 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 中的协方差和反方差