为什么有些.NET Framework类不能使用泛型呢?

Chr*_*yer 5 .net generics ienumerable

例:

System.Web.Security.MembershipCollection实现IEnumerable而不是IEnumberable<T>.为什么它不会实现后者,当它看起来会更好(例如使用LINQ)?

或者,它不一定更好吗?

Rem*_*anu 12

历史很重要.泛型并不总是存在,因此您可能会遇到在泛型出现之前设计的类和API.

此外,目标受众也很重要.某些功能针对的是可能在理解泛型方面存在问题的开发人员受众:

权衡:使用泛型的一些高级功能的API可能对某些开发人员来说太难使用.泛型的概念并没有被广泛理解,在某些情况下语法可能会带来问题,而且作为任何大的新特性,泛型可能会为一些入门级开发人员带来重要的学习曲线.

是的,引用是从2004年开始的,但是如果不是你今天使用的大部分.Net API都出现在2005年,那么引用实际上非常相关.

  • +1在之前的MS/MS人员讨论中,他们非常谨慎地对公共API进行重大更改(甚至对接口进行附加更改 - 因为这会破坏现有的接口实现者).如果你是一个纯粹的消费者,这听起来像是屁股上的痛苦,但是一旦你处于他们的位置(为其他人的消费生产API),你很快就会开始同情并遵循类似的做法,因为它会让你的生活更轻松并促进更快速地采用更新,更好的支持版本. (2认同)

Ada*_*son 10

您可以使用函数或函数将LINQ与任何一个一起IEnumerable使用.如果您确信只包含特定类型的对象,那么会稍快一些.Cast<T>()OfType<T>()IEnumerableCast<T>()

例如,

ArrayList foo = new ArrayList();

foo.Add("bar");
foo.Add("baz");

var bar = foo.Cast<string>().Select(s => s.ToUpper());
Run Code Online (Sandbox Code Playgroud)

ArrayList在.NET中泛型出现之前存在许多现有类(如),因此它们仍然是非泛型的.