Изменчивость структуры Enumerator - PullRequest
3 голосов
/ 02 марта 2011

У меня проблема со следующим кодом:

  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 счетчик сбрасывается (текущее свойство указывает на первый элемент коллекции). Это можно получить, передавая перечислитель по реф. Мне интересно, почему это так? Перечислитель - это структура. Чем вызвана эта проблема, изменчивость структуры Enumerator?

Ответы [ 3 ]

2 голосов
/ 02 марта 2011

Да, это вызывает изменение состояния структуры.

Если вы передадите структуру по значению, вы будете использовать ее копию в методе, а копию в вызывающем кодене меняется.

1 голос
/ 03 марта 2011

Попробуйте изменить переменную на тип IEnumerator (Of String) и передать ее один раз в качестве этого типа.Это приведет к тому, что он будет упакован один раз, а затем будет вести себя как класс.

0 голосов
/ 03 марта 2011

Просто верните измененную структуру Enumerator из вызываемого вами метода и присвойте ее исходной переменной.

...