5

在所有关于非泛型类过时的大惊小怪之后(几乎)为什么.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 也有非泛型集合。例如WindowCollectionItemCollection。WPF 是随 .NET 3 发布的,但泛型是在 .NET 2 中引入的:-o

对此进行更新:

现在有一张票:https ://github.com/dotnet/winforms/issues/2644 (当然是.NET Core)。

4

1 回答 1

8

考虑到这些集合早在 .Net 1.1 天就已经存在,是为了保持向后兼容性吗?

是的,但主要是因为 WinForms 自 2005 年或更早以来一直是“功能完整”的。

功能完整意味着它处于生命支持状态,只是缺少不复苏。

附加,重新编辑:

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

并且 ItemCollection 也是故意非泛型的。这是一个经过深思熟虑的特性,它可以包含所有类型,甚至同时包含不同的类型。同样,泛型不是必需的,也是不可取的。

于 2012-09-05T12:18:47.307 回答