刚才偶然发现,Add(T)定义在ICollection<T>
中,而不是IEnumerable<T>
。而且Enumerable.cs中的扩展方法不包含Add(T),我觉得这真的很奇怪。因为一个对象是可枚举的,它必须“看起来”像是一组项目的集合。有人能告诉我为什么吗?
刚才偶然发现,Add(T)定义在ICollection<T>
中,而不是IEnumerable<T>
。而且Enumerable.cs中的扩展方法不包含Add(T),我觉得这真的很奇怪。因为一个对象是可枚举的,它必须“看起来”像是一组项目的集合。有人能告诉我为什么吗?
IEnumerable<T>
是元素的序列,可以将其视为仅向前的光标。由于许多这些序列正在生成值、数据流或来自数据库的记录集,因此向它们Add
添加项毫无意义。
IEnumerable
用于读取,而不是写入。
...whatever...
{
...
var primaryColors = EnumeratePrimaryColors();
...
}
private static IEnumerable<string> EnumeratePrimaryColors() {
yield return "Red";
yield return "Blue";
yield return "Green";
}
ICollection
继承自 IEnumerable
,而 ICollection<T>
继承自 IEnumerable<T>
(后者又继承自 IEnumerable
)。换句话说,你是正确的:每个 ICollection
都是一个 IEnumerable
。 - Steven
IEnumerable<T>
要求实现Add
,那么会有更多反向的问题:为什么IEnumerable<T>
有Add
。现在的做法非常有用 :) - nawfal