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

naw*_*fal 5 .net c# generics collections

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

this.Controls.OfType<Control>();
Run Code Online (Sandbox Code Playgroud)

奇怪的是必须Control在这样的操作中指定ControlCollection何时它能够容纳的唯一东西又是一个控件.

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

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

Hen*_*man 8

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

是的,但主要是因为WinForms自2005年以来甚至更早都是"功能完备".

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

Additonal,重新编辑:

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

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

  • @nawfal我认为Silverlight属于那个类别,或者至少非常接近. (2认同)