Enumerator结构的可变性

时间:2011-03-02 09:28:15

标签: c# .net struct ienumerable

我遇到以下代码的问题:

  public static void RestoreToolStripMenuItem(ToolStripMenuItem item, List<string>.Enumerator enumerator )
    {
        item.Text = enumerator.Current;
        enumerator.MoveNext();

        if (item.HasDropDownItems)
        {
            var itemsWithoutSeparators = item.DropDownItems.OfType<ToolStripMenuItem>();
            foreach (var child in itemsWithoutSeparators)
            {
                RestoreToolStripMenuItem(child, enumerator);
            }
        }

}

在递归调用RestoreToolStripMenuItem之后,重置枚举数(当前属性指向集合的第一个元素)。它只能通过ref传递枚举器来实现。我想知道,为什么这是一个案例?枚举器是一个结构。是什么导致了这个问题,Enumerator结构的可变性?

3 个答案:

答案 0 :(得分:2)

是的,结构的变化状态导致了这种情况。

如果按值传递结构,您将在方法中使用它的副本,并且调用代码中的副本不会更改。

答案 1 :(得分:1)

尝试更改变量以键入IEnumerator(Of String),并将其作为该类型传递一次。这将导致它被装箱一次,然后表现为一个类。

答案 2 :(得分:0)

只需从您调用的方法返回已更改的Enumerator结构,并将其分配回原始变量。