yield无法使用自定义枚举/枚举器

时间:2015-04-19 00:29:34

标签: c# yield

最近我开始了一个业余爱好项目来重写集合结构,首先删除非泛型IEnumeratorIEnumerable,创建新的IEnumerator / IEnumerable基接口。当我在新的可枚举界面和正常界面之间创建转换时,我很快就遇到了产量问题。

我的IEnumerable<T>IEnumerator<T>与普通的foreachpublic static System.Collections.Generic.IEnumerable<T> ToMSEnumerable(this My.IEnumerable<T> enumerable) { foreach (var item in enumerable) // enumerating my enumerable works { yield return item; // this works } } public static My.IEnumerable<T> ToMyEnumerable(this System.Collections.Generic.IEnumerable<T> enumerable) { foreach (var item in enumerable) // obviously work { yield return item; // this is where its not working. // I haven't touched this in a few day, so I don't remember // the error message } } 完全相同,只是它们不会从非通用的继承。 为什么不能使用我的接口? {{1}}适用于我的界面。

示例:

{{1}}

1 个答案:

答案 0 :(得分:7)

您的foreach有效,因为foreach uses duck-typing - 任何使用GetEnumerator方法的内容都可以使用。这是因为foreach比泛型更旧,因此这是实现它并获得强类型的唯一合理方法。

但是,迭代器方法比泛型更早,因此yield的设计考虑了IEnumerable<T>。因此,yield 需要

  
      
  • 返回类型必须为IEnumerableIEnumerable<T>IEnumeratorIEnumerator<T>
  •   

https://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx

当然,你的自制的可枚举类不在列表中。