我有这个类和接口:
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&#39; to-bre.Presentatie.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 Inherits from Entity。
任何人都可以解释为什么这是错误的以及如何在保持界面和通用性的同时解决它?
谢谢你的帮助!
答案 0 :(得分:3)
您的界面IListViewOperations不协变。如果将接口定义设置为IListViewOperations<out T>
,则您的界面将变为协变,并且此类转换将变为隐式。请阅读以下MSDN文章中的协方差和逆变:http://msdn.microsoft.com/en-us/library/ee207183.aspx
答案 1 :(得分:1)
这不是因为BasicListViewModel<IngredientInVoorraad>
是IListViewOperations<Entity>
List<BasicListViewModel<IngredientInVoorraad>>
是List<IListViewOperations<Entity>>
。想一想,这意味着您可以Add
IListViewOperations<Entity>
列表中的任何BasicListViewModel<IngredientInVoorraad>
,而不仅仅是IEnumerable<BasicListViewModel<IngredientInVoorraad>
。
查找协方差。 C#支持协方差,但仅适用于接口。例如,IEnumerable<IListViewOperations<Entity>
是{{1}}。