我做了以下工作
class Program
{
class GenEnumerator<T> : IEnumerable
{
public T[] Values { get; set; }
public IEnumerator GetEnumerator()
{
for (int i = 0; i < Values.Length; i++)
yield return Values[i];
}
}
static void Main(string[] args)
{
GenEnumerator<string> g = new GenEnumerator<string>();
g.Values = new string[] { "a", "b", "c", "d", "e" };
g.GetEnumerator().MoveNext();
Console.WriteLine(g.GetEnumerator().Current);
Console.ReadKey();
}
}
g.GetEnumerator().Current
始终为空。
但如果我这样做 - var a = g.GetEnumerator();
当前的proeperty得到一个值并且工作正常
如果我想在没有IEnumerator
类型变量的情况下使用Current
,是否必须明确继承IEnumerator
中的类并实现其方法和属性?
谢谢, 罗伊
答案 0 :(得分:7)
您每次致电GenEnumerator
都会创建GetEnumerator
的新实例,这就是您Current
为null
的原因。而是将其存储在一个字段中并使用它。
var e = g.GetEnumerator();
if(e.MoveNext())
{
var current = e.Current;
}
答案 1 :(得分:6)
这是因为为了让Current
变为非空,您需要在同一个对象上调用MoveNext()
。
您当前的代码在临时对象上调用MoveNext()
。这是你打电话时发生的事情
g.GetEnumerator().MoveNext()`;
Console.WriteLine(g.GetEnumerator().Current);
GetEnumerator()
会返回一个对象x
x.MoveNext()
x
符合垃圾回收条件,因为它不会从您程序中的任何变量引用。g.GetEnumerator().Current
时,会返回一个新对象y
y.Current
,返回null
,因为对象MoveNext
上没有调用y
但是,当您添加变量a
时,您会在同一个对象上调用MoveNext
和Current
,从而解决问题:
GetEnumerator()
会返回一个对象x
,该对象已分配给变量a
a.MoveNext()
a.Current