我正在编写一个需要传递可变整数的迭代器。
public IEnumerable<T> Foo(ref int valueThatMeansSomething)
{
// Stuff
yield return ...;
}
这让我“错误 476 迭代器不能有 ref 或 out 参数”。
我需要的是要在迭代器中修改该整数值并可供迭代器的调用者使用。换句话说,无论叫什么Foo()
上面想知道的最终值valueThatMeansSomething
and Foo()
可以自己使用。实际上,我想要一个引用类型而不是值类型的整数。
我唯一能想到的就是编写一个类来封装我的整数并允许我修改它。
public class ValueWrapper<T>
where T : struct
{
public ValueWrapper(T item)
{
this.Item = item;
}
public T Item { get; set; }
}
So:
ValueWrapper<int> w = new ValueWrapper<int>(0);
foreach(T item in Foo(w))
{
// Do stuff
}
if (w.Item < 0) { /* Do stuff */ }
BCL 中是否已有任何类或机制可以处理此问题?有任何缺陷ValueWrapper<T>
上面提出的?
(我的实际使用比上面的示例更复杂,因此处理我的内部变量foreach
循环调用Foo()
不是一个选择。时期。)
如果您只需要写入值,那么另一种技术是:
public IEnumerable<whatever> Foo(Action<int> setter) { ... }
int value = 0;
foreach(var x in Foo(x => {value=x;}) { ... }
巧合的是,我将在 7 月份的博客中撰写一系列关于迭代器块有如此多愚蠢限制的原因的文章。 “为什么没有参考参数?”将在该系列的早期。
http://blogs.msdn.com/ericlippert/archive/tags/Iterators/default.aspx http://blogs.msdn.com/ericlippert/archive/tags/Iterators/default.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)