在所有关于非泛型类过时的大惊小怪之后(几乎)为什么.NET 集合类仍然是非泛型的?例如,Control.ControlCollection不实现IList<T>
but only IList
,或者FormCollection只实现 uptoICollection
而 not ICollection<T>
。每次我必须做一些很酷的操作IEnumerable<T>
或利用Linq
细节时,我必须总是将集合类转换为其等效的泛型类型,如下所示:
this.Controls.OfType<Control>();
当它唯一可以保存的东西又是一个控件时,必须Control
在这样的操作中指定它是很奇怪的。ControlCollection
考虑到这些集合早在 .Net 1.1 天就已经存在,是为了保持向后兼容性吗?即使是这样,为什么这些集合(还有更多)不能进一步实现通用接口以及我认为不会破坏向后兼容性的现有接口。我不确定我是否遗漏了仿制药的一些关键,可能是我对这个想法不够彻底。
编辑:虽然我在只考虑 WinForms 时问过这个问题,但我发现这也适用于 WPF 等新技术。正如@Dennis 指出的那样,WPF 也有非泛型集合。例如WindowCollection或ItemCollection。WPF 是随 .NET 3 发布的,但泛型是在 .NET 2 中引入的:-o
对此进行更新:
现在有一张票:https ://github.com/dotnet/winforms/issues/2644 (当然是.NET Core)。