为什么只有ForEach for static的静态/共享版本?

时间:2011-08-18 05:47:57

标签: c# vb.net arrays generics foreach

请有人能够解释为什么只有ForEach for static的静态/共享版本?

IE: ForEach<T>(T array[], System.Action(Of T) action[])

我认为这与实现实例方法的类型推断要求有关,但是当你声明你的数组时,你提供的类型是对的吗?

2 个答案:

答案 0 :(得分:4)

数组的一个问题是,无法记录仅在“vectors”上可用的实例方法。 “向量”是一个基数为0的一维数组 - 因此在C#中可以表示为T[]的任何东西都是向量,但例如T[,]不是。

这意味着并非Array的每个实例都应该拥有该方法 - 即使它确实如此,您将如何代表T?每个数组类型都是独立的,.NET中没有泛型类型,它是所有数组的基类。我们得到的只是Array

因此,鉴于我们必须在类型系统中的某处引入类型参数,并且考虑到我们也将其限制为“向量”类型,静态方法似乎是一种合适的解决方法。

请注意List<T>的情况,我们已经有了type参数,因此可以创建一个简单的实例方法。

当使用Array.ForEach实际上最终使用更简洁的代码而不仅仅使用foreach循环时,也值得考虑。当我已经有一个委托来执行每个元素时,我通常只使用它。否则语言结构会感觉更清晰,并且它在返回或突破循环的能力方面肯定更灵活。

答案 1 :(得分:0)

您提供T来告诉数组可以包含的内容。因此,由于Array实现了可以相互作用,因此它获得了ForEach扩展方法。

你还有什么要找的吗?

想知道Erics帖子是否可以帮助你http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx