使用双重通用性的错误

时间:2014-05-20 15:02:55

标签: c# generics

我有这个类和接口:

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。

任何人都可以解释为什么这是错误的以及如何在保持界面和通用性的同时解决它?

谢谢你的帮助!

2 个答案:

答案 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}}。

有关详细信息,请参阅Covariance and Contravariance in Generics