我今天早些时候尝试过这个:
public interface IFoo
{
IEnumerable<int> GetItems_A( ref int somethingElse );
IEnumerable<int> GetItems_B( ref int somethingElse );
}
public class Bar : IFoo
{
public IEnumerable<int> GetItems_A( ref int somethingElse )
{
// Ok...
}
public IEnumerable<int> GetItems_B( ref int somethingElse )
{
yield return 7; // CS1623: Iterators cannot have ref or out parameters
}
}
这背后的理由是什么?
C# 迭代器内部是状态机。每次你yield return
某些东西,您离开的地方应该与局部变量的状态一起保存,以便您可以返回并从那里继续。
为了保持这种状态,C# 编译器创建一个类来保存局部变量及其应继续的位置。这是不可能的ref
or out
作为类中的字段的值。因此,如果允许您将参数声明为ref
or out
,将无法保留我们停止时函数的完整快照。
EDIT:从技术上讲,并非所有方法都会返回IEnumerable<T>
被视为迭代器。只是那些使用yield
直接产生序列被视为迭代器。因此,虽然将迭代器拆分为两个方法是一个很好且常见的解决方法,但它与我刚才所说的并不矛盾。外部方法(不使用yield
直接)是not被视为迭代器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)