为什么.NET中的集合类不通用?

时间:2012-09-05 12:16:14

标签: c# .net generics collections

关于非泛型类的所有大惊小怪(几乎是),为什么.NET集合类仍然是非泛型的?例如,Control.ControlCollection未实现IList<T>,但仅IListFormCollection仅实现最高ICollection而非ICollection<T>。每次我必须在IEnumerable<T>或有效Linq细节上做一些很酷的操作时,我必须总是将集合类转换为它的等效泛型类型:

this.Controls.OfType<Control>();

奇怪的是,在Control这样的操作中必须指定ControlCollection,因为它唯一可以容纳的是控件。

是否要保持向后兼容性,考虑到这些收集存在于.Net 1.1天?即使它是,为什么这些集合(还有更多)不能进一步实现通用接口以及现有的接口,我相信这不会破坏向后兼容性。我不确定我是否遗漏了一些关键的仿制药,可能是我对这个想法并不彻底..

编辑虽然我在考虑WinForms的时候问过这个问题,但我发现这也适用于像WPF这样的新技术。正如@Dennis所指出的,WPF也有非泛型集合。例如WindowCollectionItemCollection。 WPF是在.NET 3中发布的,但是在.NET 2中引入了泛型:-o

1 个答案:

答案 0 :(得分:8)

  

是否要保持向后兼容性,考虑到这些收集存在于.Net 1.1天?

是的,但主要是因为自2005年以来甚至更早,WinForms一直是'功能完备'。

功能完成意味着它是生命支持,只是没有复苏。

Additonal,重新编辑:

WindowsCollection已经是“专用的”,它包含从Window派生的类。继承是这里的正确模型,不需要泛型。

ItemCollection也是故意非通用的。它是一个有意识的功能,它可以包含所有类型,甚至同时包含不同类型。同样,泛型不是必需的,也不是理想的。