У меня есть классы и интерфейс:
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.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 от 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>
.
Посмотрите на ковариацию. Covariance поддерживается в С#, но только для интерфейсов. Например, IEnumerable<BasicListViewModel<IngredientInVoorraad>
- это IEnumerable<IListViewOperations<Entity>
.
Для получения дополнительной информации см. Ковариация и контравариантность в целом