And*_*man 2 ienumerable list enumerator c#-4.0
当我转到List <>的定义时,我可以看到它具有实现接口IEnumerator<T>IDisposable和IEnumerator 的公共结构Enumerator 。
IEnumerator应该强制执行Reset-除了Current和MoveNext。但是仅实现了Current和MoveNext。怎么可能?
在哪里找到List <>的Reset()?
var list = new List<int>();
list.Add(23);
list.Add(44);
var Enumerator = list.GetEnumerator();
while (Enumerator.MoveNext())
{
Console.WriteLine(Enumerator.Current);
}
Enumerator.
Run Code Online (Sandbox Code Playgroud)
当我在代码中尝试时,没有Reset():
好的-我试图显示屏幕截图,但是他们不允许我这样做。
但是复制上面的代码后,在Enumerator 的Dot运算符(。)之后没有显示Reset-Method 。
有人知道这一点吗?
我看到它称为mscorlib的一部分的IEnumerator的重置。
var list = new List<int>();
list.Add(23);
list.Add(44);
var Enumerator = list.GetEnumerator();
Enumerator.MoveNext();
Enumerator.MoveNext();
Console.WriteLine(Enumerator.Current);
((IEnumerator<int>)Enumerator).Reset();
Enumerator.MoveNext();
Run Code Online (Sandbox Code Playgroud)
但是,由于IEnumerator是接口,因此如何调用代码?
IEnumerator中的Reset()应该只是一个定义,实现应留给使用该接口的任何人。
但是在某种程度上,这里仅通过定义要实现的接口即可提供实际功能。我在任何地方都看不到实际的实现,而那部分我不理解。
它明确地实现,如在文档中,因为是IEnumerator.Current。换句话说,您只能在编译时类型为的值上调用方法IEnumerator。
因此,您可以使用:
// Casing changed to be more conventional
var enumerator = list.GetEnumerator();
((IEnumerator)enumerator).Reset();
Run Code Online (Sandbox Code Playgroud)
但是,无论如何这将使该值装箱(作为List<T>.Enumerator结构),这将使其毫无意义。尚不清楚您是否只对明显缺乏Reset方法感兴趣,但总的来说,我强烈建议您不要依赖IEnumerator.Reset-它通常没有实现,IMO应该不应该作为启动接口的一部分与...