【发布时间】:2011-08-18 05:47:56
【问题描述】:
有人可以解释一下为什么对于数组只有一个静态/共享版本的 ForEach 吗?
IE: ForEach<T>(T array[], System.Action(Of T) action[])
我认为这与实现实例方法的类型推断要求有关,但是当您声明数组时,您提供的类型对吗?
【问题讨论】:
标签: c# vb.net arrays generics foreach
有人可以解释一下为什么对于数组只有一个静态/共享版本的 ForEach 吗?
IE: ForEach<T>(T array[], System.Action(Of T) action[])
我认为这与实现实例方法的类型推断要求有关,但是当您声明数组时,您提供的类型对吗?
【问题讨论】:
标签: c# vb.net arrays generics foreach
数组的一个问题是没有地方可以记录实例方法,这些方法只能在“向量”上使用。 “向量”是一个基数为 0 的一维数组 - 因此,在 C# 中任何可以表示为 T[] 的东西都是向量,但 T[,] 不是,例如。
这意味着不是Array 的每个实例都应该有该方法——即使有,你将如何表示T?每个数组类型都是独立的,在 .NET 中没有 generic 类型,它是所有数组的基类。我们只有Array。
因此,鉴于我们必须在类型系统中的某处引入类型参数,并且我们还将其限制为“向量”类型,因此静态方法似乎是一种合适的解决方法。
注意List<T> 的情况不是,我们已经有了类型参数,所以可以创建一个简单的实例方法。
同样值得考虑的是,使用Array.ForEach 最终得到的代码比仅仅使用foreach 循环更简洁。我通常只会在我已经有一个委托对每个元素执行时才使用它。否则,语言结构会感觉更干净,而且毫无例外地返回或跳出循环的能力肯定更灵活。
【讨论】:
你提供 T 来告诉数组可以包含什么。所以由于 Array 实现了 ienumerable,因此它得到了 ForEach 扩展方法。
你还有什么要找的吗?
想知道 Erics 的帖子是否对您有帮助 http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx
【讨论】:
ForEach扩展方法?
ForEach 扩展方法。你必须自己提供一个。还要注意ForEach 通常是IEnumerable<T> 上的扩展方法,而不是IEnumerable,所以实际上更多的是关于实现IEnumerable<T> 的向量...如果你只有Array 类型的引用,你我想先打电话给Cast<T>() 或OfType<T>()。