2013-03-14 4 views
1

Мне нужна коллекция, которая имеет метод Add и параметр ковариантного типа.Есть ли способ создать коллекцию, которая имеет метод Add, но также имеет параметр ковариантного типа?

IEnumerable Т покрывает параметр типа ковариантного

public interface IEnumerable<out T> : IEnumerable 

но это не имеет какой-либо метода Add.

IList of T не имеет параметра ковариантного типа, но имеет метод Add.

Кто-нибудь знает коллекцию, которая будет охватывать это или как ее создать?

ответ

3

IEnumerable<out T> означает, что «значение этого типа может быть отнесены к переменному любому типу IEnumerable<X> где X является T или родитель T»

Если у вас что-то вроде IList<out T>, это означало бы, вы могли бы сделать следующие:

IList<string> strings = new List<string>(); 
IList<object> objects = strings; 
objects.Add(new object()); 

Очевидно, что это не безопасный тип, поэтому нет такого интерфейса.

0

Один не может иметь интерфейс, который является сотрудничества варианта по отношению к T и включает в себя Add метода, который принимает тип T, так как тот, который будет означать, что сборник, который был способен принимать любой тип из Dog был способен принятия любого типа Animal. Можно было определить Contra вариант интерфейса IFeedable<in T> с методом Feed, который принял параметр типа T (я предпочитаю «подавать» на «добавить», поскольку последний термин также может ссылаться на арифметическую операцию, а так как существование объект, который может принимать объекты и что-то делать с ними, не означает, что эти объекты добавляются в какую-то коллекцию, например, можно легко получить класс фильтрации, который принял IFeedable<T> и Predicate<T> и реализовал IFeedable<T>, взяв каждый T он был задан, называется предикатной функцией и передал элемент в поставленный IFeedable<T> только в том случае, если предикат возвратил true. Данные, данные для такого метода, не обязательно будут «добавлены» к любому виду коллекции, но тем не менее будут «поданы» "to t он объектно реализует интерфейс.

Смежные вопросы