1

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

T 的 IEnumerable 覆盖协变类型参数

public interface IEnumerable<out T> : IEnumerable

但它没有 Add 方法。

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

有谁知道一个可以涵盖这个或如何制作的集合?

4

2 回答 2

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());

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

于 2013-03-14T22:22:18.420 回答
0

不能有一个接口,它是相对于并包含一个接受 type 的方法的共同变体,因为这意味着能够接受任何类型的集合能够接受任何类型的。可以定义一个带有类型参数的方法的Contra变体接口(我更喜欢“feed”而不是“add”,因为后一个术语也可以指算术运算,并且因为存在可以接受对象的对象并且对它们做一些事情并不意味着这些对象被添加到某种集合中;例如,一个人可以很容易地拥有一个过滤类,它接受一个和一个TAddTDogAnimalIFeedable<in T>FeedTIFeedable<T>Predicate<T>IFeedable<T>通过获取每个给定的值来实现,称为谓词函数,并且仅当谓词返回 true 时才T将项目传递给提供的项。IFeedable<T>提供给这种方法的数据不一定会“添加”到任何类型的集合中,但仍会“馈送”给实现接口的对象。

于 2013-03-14T23:12:43.853 回答