最近我开始了一个业余爱好项目来重写集合结构,首先删除非泛型IEnumerator
和IEnumerable
,创建新的IEnumerator / IEnumerable基接口。当我在新的可枚举界面和正常界面之间创建转换时,我很快就遇到了产量问题。
我的IEnumerable<T>
和IEnumerator<T>
与普通的foreach
和public 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}}
答案 0 :(得分:7)
您的foreach
有效,因为foreach
uses duck-typing - 任何使用GetEnumerator
方法的内容都可以使用。这是因为foreach
比泛型更旧,因此这是实现它并获得强类型的唯一合理方法。
但是,迭代器方法不比泛型更早,因此yield
的设计考虑了IEnumerable<T>
。因此,yield
需要:
- 返回类型必须为
IEnumerable
,IEnumerable<T>
,IEnumerator
或IEnumerator<T>
。
(https://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx)
当然,你的自制的可枚举类不在列表中。