有没有办法创建一个具有Add方法但也有一个协变类型参数的集合?

时间:2013-03-14 22:18:02

标签: c# generics collections ienumerable

我需要一个具有Add方法和协变类型参数的集合。

IE的数量覆盖了协变类型参数

public interface IEnumerable<out T> : IEnumerable

但它没有添加方法。

T的IList没有协变类型参数,但有Add方法。

有没有人知道会涵盖这个或如何制作一个的集合?

2 个答案:

答案 0 :(得分:3)

IEnumerable<out T>表示“此类型的值可以分配给任何类型IEnumerable<X>的变量,其中XT或父T

如果您有类似IList<out T>的内容,则表示您可以执行以下操作:

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

显然这不是类型安全的,这就是为什么不存在这样的接口的原因。

答案 1 :(得分:0)

对于T,不能有一个 co <​​/ i>变体的接口,并且包含一个Add类型的T方法,因为意味着能够接受任何类型的Dog的集合能够接受任何类型的Animal。可以使用IFeedable<in T>方法定义 Contra 变体接口Feed,该方法采用T类型的参数(我更喜欢“feed”到“add”,因为后一个术语也可以指一个算术运算,并且由于一个可以接受对象并对它们做某事的对象的存在并不意味着这些对象被添加到某种集合中;例如,一个人可能很容易一个过滤类,它采用IFeedable<T>Predicate<T>并通过获取它的每个IFeedable<T>来实现T,称为谓词函数,并将项目传递给提供的{ {1}}仅当谓词返回true时。给予这种方法的数据不一定会“添加”到任何类型的集合中,但仍然会被“馈送”到实现该接口的对象。