gpt4 book ai didi

c# - Enumerator.MoveNext() 的奇怪行为

转载 作者:IT王子 更新时间:2023-10-29 04:03:43 26 4
gpt4 key购买 nike

有人可以解释为什么这段代码在无限循环中运行吗?为什么 MoveNext() 总是返回 true

var x = new { TempList = new List<int> { 1, 3, 6, 9 }.GetEnumerator() };
while (x.TempList.MoveNext())
{
Console.WriteLine("Hello World");
}

最佳答案

List<T>.GetEnumerator() 返回可变值类型 ( List<T>.Enumerator )。您将该值存储在匿名类型中。

现在,让我们看看它做了什么:

while (x.TempList.MoveNext())
{
// Ignore this
}

相当于:

while (true)
{
var tmp = x.TempList;
var result = tmp.MoveNext();
if (!result)
{
break;
}

// Original loop body
}

现在请注意我们所说的 MoveNext() on - 匿名类型值的副本。您实际上无法更改匿名类型中的值 - 您所拥有的只是一个可以调用的属性,它将为您提供该值的副本。

如果将代码更改为:

var x = new { TempList = (IEnumerable<int>) new List<int> { 1, 3, 6, 9 }.GetEnumerator() };

...那么您最终会得到一个匿名类型的引用。对包含可变值的框的引用。当您调用 MoveNext()在该引用上,框中的值将发生变化,因此它将执行您想要的操作。

对于非常相似的情况的分析(再次使用 List<T>.GetEnumerator() )参见 my 2010 blog post "Iterate, damn you!" .

关于c# - Enumerator.MoveNext() 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31591238/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com