C#中yield return的操作数是否需要实现IEnumerable接口?
C# yield return 相关疑问解答
核心结论
- TCustom类型不需要实现IEnumerable接口
- 即使TCustom未实现IEnumerable接口,也完全可以作为yield return语句的返回对象
原理说明
你产生这个疑问大概率是混淆了「迭代器方法返回的集合类型」和「集合中单个元素的类型」的要求:
- 你定义的
Iterator()方法返回值为非泛型的IEnumerable,这个接口是用来标记「当前方法返回的是一个可枚举的集合」,约束的是整个集合的行为,和集合内的元素无关。 yield return后面跟着的是集合中的单个元素:- 对于非泛型
IEnumerable对应的迭代器来说,只要求返回的元素可以隐式转换为object即可,所有C#类型都默认满足这个要求 - 如果你使用泛型版本的
IEnumerable<TCustom>作为迭代器返回值,仅要求yield return返回的元素是TCustom类型或可隐式转换为TCustom的类型,同样不需要元素实现IEnumerable接口
- 对于非泛型
- 只有当你需要把某对象作为「可枚举集合整体」通过yield return返回时,才要求该对象实现IEnumerable接口,比如你的迭代器返回值是
IEnumerable<IEnumerable>的场景。
代码验证
你提供的示例代码本身可以正常编译运行,仅需确认RandomCollection实现的IEnumerable接口枚举出来的元素确实是TCustom类型即可,TCustom本身不需要做任何额外的接口实现。
内容的提问来源于stack exchange,提问作者Samin Sadman Shad
相关产品推荐
相关产品推荐

