#c_sharp #шаблоны_проектирования #абстрактная_фабрика
Есть следующий не большой проект: AbstractClass.cs public abstract class AbstractClass { } Gover.cs class Gover : AbstractClass { } Program.cs class Program { public Listlist; void Main(string[] args) { list = new List (); //Ошибка: Неявное преобразование типа "...List " в "...List } Но появляется (как показано выше) ошибка не понятная мне. Почему я не могу присвоит объекту AbstractClass объект Gover? Ведь Gover унаследован от AbstractClass?
Ответы
Ответ 1
Как уже сказал @VladD, проблема в том, что Listне ковариантен по T (т.к. List - класс, а классы в C# могут быть только инвариантны). Однако вместо него можно использовать реализуемый им ковариантный интерфейс IEnumerable , чтобы сделать ваш код рабочим. Например: public class Test { public static IEnumerable list; static void Main(string[] args) { list = new List (); } } Ответ 2
Проблема вот в чём: Listне ковариантен по T. Нормальными словами: Если T1 — подкласс T2, то при этом List не подкласс List . Почему это так? Смотрите. Допустим, что такое, как вы написали, было бы возможно: public List list; List goverList = new List (); list = goverList; Тогда было бы возможно написать: list.Add(new Gover2()); где Gover2 — другой потомок AbstractClass. То есть в списке goverList, который вроде бы имеет тип List , внезапно оказался бы элемент постороннего типа Gover2. Катастрофа! Вывод: так, как вы написали, не получится. Пишите list = new List (), например. Или сделайте тип списка шаблонным. Или ещё что-нибудь, в зависимости от того, что вам нужно.
Комментариев нет:
Отправить комментарий