Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / универсальные типы, наследование, преобразование / 7 сообщений из 7, страница 1 из 1
29.11.2013, 11:57
    #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
29.11.2013, 12:09
    #38483063
Sergey S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
универсальные типы, наследование, преобразование
Может убрать ограничение where T : DirectoryBase<DirectoryItem> с:
Код: c#
1.
public class DirectoryEditor<T>  where T : DirectoryBase<DirectoryItem>

?
...
Рейтинг: 0 / 0
29.11.2013, 12:19
    #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
29.11.2013, 12:34
    #38483127
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
универсальные типы, наследование, преобразование
netivanвариантность только для интерфейсов и делегатов можно использовать
И еще для IEnumerable<T>. В данном случае всё нормально скомпилируется, если объявить ограничения для DirectoryEditor<T> так:
Код: c#
1.
public class DirectoryEditor<T>  where T : IEnumerable<DirectoryItem> {...}
...
Рейтинг: 0 / 0
29.11.2013, 13:48
    #38483264
Alex Shulg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
универсальные типы, наследование, преобразование
netivanвариантность только для интерфейсов и делегатов можно использоватьЭто я знаю, вот и думал как лучше извратиться с интерфейсами

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

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



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


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