VB.NET для каждого шага в теле цикла для коллекции IEnumerable!Как?Зачем? - PullRequest
0 голосов
/ 11 марта 2010

Предупреждение: это унаследованный унаследованный код, который был изначально составлен в первые годы существования VB (не .net, обратите внимание). Я уже имел дело со всевозможными странностями и злом, эта проблема еще более странная.

У меня есть класс, который наследует от IEnumrable, свойство Count которого сообщает 0 (ноль) элементов, но цикл For Each входит в тело цикла и пытается использовать переменную, в которой он должен просто двигаться. Мой код:

    On Error Resume Next
    Dim d As Foo
    For Each d In fooCollection
        ' use d and throws an exception
    Next d

Странно, но каждый раз, когда к d обращаются, в окне вывода выдается исключение:

Первое исключение типа 'System.NullReferenceException'

но я не останавливаюсь на исключении (не в блоке try / catch).

Причиной этой странности является "При ошибке продолжить дальше"?

Найдены странности:

Согласно комментариям Роуленда и Джона, я проверил класс Foo: Метод GetEnumerator внутри Foo фактически ничего не возвращал! У него было пустое тело. Это в сочетании с On Error Resume Next до того, как цикл вызвал хаос! Вау, это было некрасиво. Спасибо за подсказки, ребята!

Ответы [ 4 ]

2 голосов
/ 11 марта 2010

Взгляните на зло при возобновлении ошибки Далее. Он возобновляется прямо в цикле, когда ваша ссылка fooCollection имеет значение Nothing.

2 голосов
/ 11 марта 2010

IEnumerable и Count не связаны. Когда вы делаете For Each, вы, по сути, делаете это:

Dim en as IEnumerator = fooCollection.GetEnumerator()
While en.MoveNext()
   d = en.Current()
   ' your code here...
Wend

(Прошу прощения за мой синтаксис, возможно, с мусором; я давно не занимался VB.)

Итак, значение вашего свойства Count не имеет ничего общего с функциональностью цикла. Вы внедрили IEnumerator самостоятельно? Если это так, я подозреваю, что вы сделали это неправильно.

1 голос
/ 11 марта 2010

Избавьтесь от возобновления ошибки далее. Можете ли вы опубликовать, как выглядит Foo?

0 голосов
/ 27 февраля 2015

Вот метод, используемый для очистки точек всех серий графика, без удаления самих серий:

' clear all serial of a chart
Public Sub clearChart(ByVal chart As Chart)
    Dim sc As SeriesCollection = chart.Series
    Dim etor As IEnumerator = sc.GetEnumerator()
    Dim serial As Series

    While etor.MoveNext()
        serial = etor.Current()
        serial.Points.Clear()
    End While
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...