2

很多人问我为什么,我没有很好的答案。

显然有一个很好的理由。有人知道吗?

我在这里搜索并找到了这个问题。它解释了它是如何工作的,但没有解释为什么。

4

2 回答 2

11

假设您想要等效的 anIEnumerable<int>但正在使用 C# 1.0。您可以实施IEnumerable- 但这需要在每次迭代时进行装箱和拆箱。使用那种鸭子打字版本的foreach你可以不用任何拳击就可以逃脱。在许多情况下,拳击实际上并没有那么有害(我倾向于发现性能影响被夸大了),但它仍然不雅。

我强烈、强烈怀疑,如果泛型出现在 C# 1.0 中,foreach就会被限制在IEnumerable<T>.

于 2008-12-25T20:49:44.897 回答
1

与 IEnumerable 相比,鸭式 foreach 有几个优点:

  1. 有些东西足以满足“IEnumerable”合同的要求,可以与“foreach”一起使用,但不能完全满足合同,尤其是重复获得独立枚举数的能力。关于这一点,让“foreach”接受 IEnumerator [通用或非通用] 或 IEnumerable [同样] 将是一种替代解决方案。
  2. 尽管 IEnumerable.GetEnumerator 的某些实现返回一个实现 IEnumerator 的结构,并且虽然这在使用鸭子类型时很有用,但在某些情况下该行为可能会出现问题。foreach 使用鸭子类型的事实允许编译器有一个公共 GetEnumerator() 函数返回一个结构类型枚举器(它不实现任何接口)并让编译器使用它,同时让 IEnumerable.GetEnumerator 返回一个类。

第二个优势实际上只能通过鸭式打字来实现。

于 2011-11-15T17:45:13.077 回答