Невозможно привести из DerivedT <Derived2T> к BaseT <base2T> - PullRequest
2 голосов
/ 25 июня 2011

У меня есть эти классы, реализация шаблона активной записи:

public abstract class RecordCollection<T> : ObservableCollection<T> where T : Record
public abstract class Record : INotifyPropertyChanged

каждый раз, когда я хочу определить строку базы данных (т. Е. Контакт), я создаю новый класс записи, например:

public class Contact : Record

и набор строк базы данных (т.е. контактов) в виде:

public class ContactCollection : RecordCollection<Contact>

, но после этого я не могу использовать generic для содержать запись colletcion:

ContactCollection contColl = new ContactCollection(databaseman dbMan);
contColl.Load();

RecordCollection<Record> recordColl = contColl;

это дает мне «Не удается неявно преобразовать тип ContactCollection в>».Любая помощь будет оценена.

1 Ответ

6 голосов
/ 25 июня 2011

Этот кастинг запрещен просто потому, что это может произойти:

public class AnotherTypeOfContact: Record {}

Теперь мы можем сделать:

recordColl.Add(new AnotherTpyeOfContact()) //runtime exception as no conversion between AnotherTypeOfContact and Contact

Это то, что называется ковариация и контравариация ( подробнее здесь ) между универсальными типами. Чтобы это работало, contColl должен реализовывать только интерфейс "out", чего нет. Под этим я подразумеваю, что для сохранения безопасности типов contColl не может позволить добавлять элементы (формально, T может быть только типом возврата метода)

Обратите внимание, что в массивах это разрешено , но это нарушенная ковариация, что прискорбно: больше здесь

...