在我不断追求吸吮的过程中,我试图理解"收益"陈述,但我一直遇到同样的错误.
[someMethod]的主体不能是迭代器块,因为'System.Collections.Generic.List
'不是迭代器接口类型.
这是我遇到的代码:
foreach (XElement header in headersXml.Root.Elements()){ yield return (ParseHeader(header)); }
我究竟做错了什么?我不能在迭代器中使用yield吗?那有什么意义呢?在这个例子中,它说它List
不是迭代器接口类型.
ProductMixHeader
是一个自定义类,但我想List
是一个迭代器接口类型,不是吗?
- 编辑 -
感谢所有快速解答.
我知道这个问题不是全新的,同样的资源不断涌现.
事实证明我认为我可以List
作为返回类型返回,但由于List
不是懒惰,它不能.更改我的返回类型以IEnumerable
解决问题:D
一个有点相关的问题(不值得打开一个新线程):IEnumerable
如果我确定99%的情况我将要去.ToList(),它是否值得作为返回类型给出?性能影响是什么?
使用yield return的方法必须声明为返回以下两个接口之一:
IEnumerableIEnumerator
(感谢Jon和Marc指出IEnumerator)
例:
public IEnumerableYourMethod() { foreach (XElement header in headersXml.Root.Elements()) { yield return (ParseHeader(header)); } }
yield是一个懒惰的数据生成器,只在检索到第一个后生成另一个项目,而返回一个列表将一次性返回所有内容.
所以有区别,你需要正确地声明方法.
有关更多信息,请阅读Jon的答案,其中包含一些非常有用的链接.
这是一个棘手的话题.简而言之,它是实现IEnumerable及其朋友的简单方法.编译器为您构建状态机,将参数和局部变量转换为新类中的实例变量.复杂的东西.
我有一些资源:
深度C#的第6章(从该页面免费下载)
迭代器,迭代器块和数据管道(文章)
迭代器块实现细节(文章)
"yield"创建一个迭代器块 - 一个编译器生成的类,可以实现IEnumerable[
或者IEnumerator[
.Jon Skeet 在深度C#的第6章中对此进行了非常好的(并且免费的)讨论.
但基本上 - 使用"yield"你的方法必须返回一个IEnumerable[
或IEnumerator[
.在这种情况下:
public IEnumerableSomeMethod() { // ... foreach (XElement header in headersXml.Root.Elements()){ yield return (ParseHeader(header)); } }