ошибка при использовании двойной универсальности

1

У меня есть классы и интерфейс:

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.

Может ли кто-нибудь объяснить, почему это неправильно, и как его исправить, сохраняя интерфейс и универсальность?

Спасибо за помощь!

Теги:
generics

2 ответа

3
Лучший ответ

Ваш интерфейс IListViewOperations не является ковариантным. Если вы установите определение интерфейса в IListViewOperations<out T>, ваш интерфейс станет ковариантным, и такие преобразования станут неявными. Подробнее о ковариации и контравариантности читайте в следующей статье MSDN: http://msdn.microsoft.com/en-us/library/ee207183.aspx

1

Это не потому, что BasicListViewModel<IngredientInVoorraad> является IListViewOperations<Entity> который List<BasicListViewModel<IngredientInVoorraad>> является List<IListViewOperations<Entity>>. Подумайте об этом, это означало бы, что вы могли бы Add любой IListViewOperations<Entity> в список, а не только BasicListViewModel<IngredientInVoorraad>.

Посмотрите на ковариацию. Covariance поддерживается в С#, но только для интерфейсов. Например, IEnumerable<BasicListViewModel<IngredientInVoorraad> - это IEnumerable<IListViewOperations<Entity>.

Для получения дополнительной информации см. Ковариация и контравариантность в целом

Ещё вопросы

Сообщество Overcoder
Наверх
Меню