Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 This Generic  [new]
vb_sub
Member

Откуда:
Сообщений: 495
Всем привет у меня есть следующая структура моделей.

Модели:
  public  class BaseModel
    {

        /// <summary>
        /// Храним ссылку на коллекцию, в которой элемент находится
        /// </summary>

        private BaseSet<BaseModel> _baseSet;

        public BaseSet<BaseModel> baseSet
        {
            get { return _baseSet; }
            set { _baseSet = value; }
        }
    }


    public class Derived:BaseModel
    {        

    }


Класс, хранящий коллекцию моделей

 /// <summary>
    /// Содержит элементы BaseModel в списке
    /// </summary>
    public class BaseSet<T>
    where T:BaseModel
    {
        /// <summary>
        /// Список для хранения
        /// </summary>
        public List<T> ListOfBaseModels { get; set; }

        public void AddItems(IReadOnlyList<T> Items) 
        {
            foreach (T item in Items)
            {
             /// присваиваем ссылку на  коллекцию для элемента
                item.baseSet = this; //Не удается неявно преобразовать тип Generic.BaseSet<T> в  Generic.BaseSet<Generic.BaseModel> 
            }
        }
    }


    public class DerivedSet: 
        BaseSet<Derived>
    {
    }



Мне необходимо получить следующую функциональность (см рис)

Почему идет ошибка преобразования типов, ведь я указал, что T:BaseModel? Спасибо

К сообщению приложен файл. Размер - 16Kb
15 мар 19, 15:41    [21833987]     Ответить | Цитировать Сообщить модератору
 Re: This Generic  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3303
читайте, что такое
* инвариантность
* ковариантность
* контрвариантность
у обобщенных интерфейсов

Нельзя привести класс MyGeneric<string> к MyGeneric<object>, так как это 2 разных класса, которые не унаследованы друг от друга и для которых не определены оператора приведения типа друг к другу, хотя string и наследует object;
15 мар 19, 15:48    [21833995]     Ответить | Цитировать Сообщить модератору
 Re: This Generic  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38435
vb_sub,
Зачем это всё?
На одну ИС создается одна Модель
15 мар 19, 16:12    [21834022]     Ответить | Цитировать Сообщить модератору
 Re: This Generic  [new]
vb_sub
Member

Откуда:
Сообщений: 495
Petro123,
что такое "ИС"?
15 мар 19, 16:19    [21834029]     Ответить | Цитировать Сообщить модератору
 Re: This Generic  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38435
vb_sub,

ГОСТ 34.321-96
ИНФОРМАЦИОННАЯ СИСТЕМА
15 мар 19, 16:30    [21834051]     Ответить | Цитировать Сообщить модератору
 Re: This Generic  [new]
vb_sub
Member

Откуда:
Сообщений: 495
Petro123,
у Вас на всё приложение используется одна модель?
15 мар 19, 16:39    [21834073]     Ответить | Цитировать Сообщить модератору
 Re: This Generic  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38435
vb_sub
Petro123,
у Вас на всё приложение используется одна модель?
одна БОЛЬШАЯ))
А ИС НЕСКОЛЬКО.
И каждая ИС делалась в несколько очередей. По ЧТЗ.
15 мар 19, 16:45    [21834081]     Ответить | Цитировать Сообщить модератору
 Re: This Generic  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4710
Roman Mejtes
читайте, что такое
* инвариантность
* ковариантность
* контрвариантность
у обобщенных интерфейсов

Нельзя привести класс MyGeneric<string> к MyGeneric<object>, так как это 2 разных класса, которые не унаследованы друг от друга и для которых не определены оператора приведения типа друг к другу, хотя string и наследует object;

Короче говоря, ко/контрвариантность (приведение типа аргументов генерик-типа согласно иерархии наследования) работает только в интерфейсах и делегатах. С конкретными реализациями - нет.
15 мар 19, 18:23    [21834194]     Ответить | Цитировать Сообщить модератору
 Re: This Generic  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3303
Сон Веры Павловны
Roman Mejtes
читайте, что такое
* инвариантность
* ковариантность
* контрвариантность
у обобщенных интерфейсов

Нельзя привести класс MyGeneric<string> к MyGeneric<object>, так как это 2 разных класса, которые не унаследованы друг от друга и для которых не определены оператора приведения типа друг к другу, хотя string и наследует object;

Короче говоря, ко/контрвариантность (приведение типа аргументов генерик-типа согласно иерархии наследования) работает только в интерфейсах и делегатах. С конкретными реализациями - нет.

массивы ссылочных типов поддерживают ковариантность.
можно спокойно привести тип MyClass[] к типу object[] или другому базовому. Фокус тут в том, что каждый элемент массива имеет длину 4\8 байт, которая является ссылкой на реальный объект.
Естественно, так же фокус с структурой не прокатит, так как их размер не фиксированный, они не поддерживают наследование и потребуется упаковка.
15 мар 19, 21:10    [21834339]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить