powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / универсальные типы, наследование, преобразование
7 сообщений из 7, страница 1 из 1
универсальные типы, наследование, преобразование
    #38483041
Alex Shulg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет! Помогите разобраться, а то запутался...

Имеем базовые классы:
Код: c#
1.
2.
3.
public class DirectoryItem {}

public class DirectoryItemNew : DirectoryItem {}


базовый справочник:
Код: c#
1.
public class DirectoryBase<T> : List<T> where T : DirectoryItem, new() {}


парочку производных справочников:
Код: c#
1.
2.
public class Directory1 : DirectoryBase<DirectoryItem> {}
public class Directory2 : DirectoryBase<DirectoryItemNew> {}


и вот такой вот класс:
Код: c#
1.
public class DirectoryEditor<T> : where T : DirectoryBase<DirectoryItem>


а теперь проблема:
Код: c#
1.
2.
var D1 = new DirectoryEditor<Directory1>(); // OK
var D2 = new DirectoryEditor<Directory2>(); // ошибка


Ошибка: Не удается использовать тип "Directory2" в качестве параметра типа "T" для базового типа или метода "DirectoryEditor<T>". Отсутствует неявное преобразование ссылки из "Directory2" в "DirectoryBase<DirectoryItem>".

Догадываюсь, что поможет мне универсальный модификатор out, только где и как его реализовать?
...
Рейтинг: 0 / 0
универсальные типы, наследование, преобразование
    #38483063
Sergey S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может убрать ограничение where T : DirectoryBase<DirectoryItem> с:
Код: c#
1.
public class DirectoryEditor<T>  where T : DirectoryBase<DirectoryItem>

?
...
Рейтинг: 0 / 0
универсальные типы, наследование, преобразование
    #38483088
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex ShulgВсем привет! Помогите разобраться, а то запутался...

Имеем базовые классы:
Код: c#
1.
2.
3.
public class DirectoryItem {}

public class DirectoryItemNew : DirectoryItem {}


базовый справочник:
Код: c#
1.
public class DirectoryBase<T> : List<T> where T : DirectoryItem, new() {}


парочку производных справочников:
Код: c#
1.
2.
public class Directory1 : DirectoryBase<DirectoryItem> {}
public class Directory2 : DirectoryBase<DirectoryItemNew> {}


и вот такой вот класс:
Код: c#
1.
public class DirectoryEditor<T> : where T : DirectoryBase<DirectoryItem>


а теперь проблема:
Код: c#
1.
2.
var D1 = new DirectoryEditor<Directory1>(); // OK
var D2 = new DirectoryEditor<Directory2>(); // ошибка


Ошибка: Не удается использовать тип "Directory2" в качестве параметра типа "T" для базового типа или метода "DirectoryEditor<T>". Отсутствует неявное преобразование ссылки из "Directory2" в "DirectoryBase<DirectoryItem>".

Догадываюсь, что поможет мне универсальный модификатор out, только где и как его реализовать?
1. вариантность только для интерфейсов и делегатов можно использовать
2. Ошибка понятна, вы же сами определили ограничение:)
Код: c#
1.
 where T : DirectoryBase<DirectoryItem>
...
Рейтинг: 0 / 0
универсальные типы, наследование, преобразование
    #38483127
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanвариантность только для интерфейсов и делегатов можно использовать
И еще для IEnumerable<T>. В данном случае всё нормально скомпилируется, если объявить ограничения для DirectoryEditor<T> так:
Код: c#
1.
public class DirectoryEditor<T>  where T : IEnumerable<DirectoryItem> {...}
...
Рейтинг: 0 / 0
универсальные типы, наследование, преобразование
    #38483264
Alex Shulg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
netivanвариантность только для интерфейсов и делегатов можно использоватьЭто я знаю, вот и думал как лучше извратиться с интерфейсами

Сон Веры ПавловныИ еще для IEnumerable<T>. В данном случае всё нормально скомпилируется, если объявить ограничения для DirectoryEditor<T> так:
Код: c#
1.
public class DirectoryEditor<T>  where T : IEnumerable<DirectoryItem> {...}

Реально, ТЕМА!!! Работает! СПС!
Вот так я и хотел! Правда думал через свой интерфейс, а Вы подсказали как через стандартный :)
...
Рейтинг: 0 / 0
универсальные типы, наследование, преобразование
    #38483267
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловныnetivanвариантность только для интерфейсов и делегатов можно использовать
И еще для IEnumerable<T>. В данном случае всё нормально скомпилируется, если объявить ограничения для DirectoryEditor<T> так:
Код: c#
1.
public class DirectoryEditor<T>  where T : IEnumerable<DirectoryItem> {...}



а что IEnumerable<T> не интерфейс?
...
Рейтинг: 0 / 0
универсальные типы, наследование, преобразование
    #38483487
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pationа что IEnumerable<T> не интерфейс?
Мда. Как-то я этот факт упустил из вида :)
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / универсальные типы, наследование, преобразование
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]