Почему я получаю ложное предупреждение CA2202?

#vb.net #dispose

#vb.net #утилизировать

Вопрос:

Приведенная ниже минимальная программа выдает предупреждение CA2202: объект PList.GetEnumerator() может быть удален более одного раза в методе Module1.Main() . [Это вырезано и вставлено из предупреждающего сообщения]/

Если вы измените содержимое списка, скажем, на целое число, предупреждение исчезнет. Оно также исчезает, если вы удаляете окружающий цикл Do.

Я использую Visual Studio Community 2017 в Windows 7.

 Module Module1

  Sub Main()

    Dim KVP As KeyValuePair(Of Integer, List(Of Object))
    Dim PList As New SortedList(Of Integer, List(Of Object))

    Do While True
      For Each KVP In PList

      Next KVP
    Loop

  End Sub

End Module
  

Я всегда могу проигнорировать предупреждение, но я заинтригован тем, почему такая простая программа может его выдать. У кого-нибудь из экспертов есть какие-нибудь идеи?

Комментарии:

1. KVP это имя, присвоенное локальной переменной. Дважды.

2. Я не согласен. Поскольку KVP определен в его операторе Dim, он используется в для каждого оператора. Кроме того, удаление оператора DIM по-прежнему выдает сообщение об ошибке.

3. VB.Net позволяет вам это сделать. Попробуйте с For Each KVP As KeyValuePair(Of Integer, List(Of Object)) In PList помощью . Удалите / прокомментируйте другое объявление KVP.

4. Вы имеете в виду CA2202 вместо C2202?

5. Спасибо @TnTinMn — да, я сделал! Отредактирует.

Ответ №1:

Как указал @TnTimMn, это виртуальный дубликат. Похоже, что предупреждение является ложным срабатыванием. Спасибо всем за ваши полезные комментарии.