CA2202 Предупреждение для цикла ForEach - PullRequest
4 голосов
/ 08 октября 2019

Анализ fxcop выдает предупреждение CA2202 для следующего тела метода в строке foreach:

public void LogAnalysis(IEnumerable<string> steps, bool append = false)
{
    if (steps != null)
    {
        StringBuilder sb = new StringBuilder();
        try
        {
            foreach (string step in steps) // this is line 34
            {
                sb.AppendLine(step);
            }
            if (append)
            {
                sb.Insert(0, string.Format(
                     CultureInfo.InvariantCulture, 
                    "__________Logging started at {0}__________\n",
                     DateTime.Now.ToString(CultureInfo.InvariantCulture)));

                File.AppendAllText(AnalysisLogFile, sb.ToString());
            }
            else
            {
                File.WriteAllText(AnalysisLogFile, sb.ToString());
            }
        }
        catch (Exception e) when (e is IOException || e is UnauthorizedAccessException)
        {
            LogError(e.Message);
        }
        sb.Clear();
    }
}

Предупреждение CA2202 Object 'steps.GetEnumerator () 'может быть размещен более одного раза в методе' LoggingService.LogAnalysis (IEnumerable, bool) '. Чтобы избежать создания System.ObjectDisposedException, вы не должны вызывать Dispose более одного раза для объекта .: Строки: 34

Я провел некоторое исследование и увидел, что nested using операторы и Dispose вызовы заставляют анализатор урод и выдавать это предупреждение , но у меня нет ни явного Dispose вызова, ни using блок. Я не встречал другого случая, когда это предупреждение появляется для цикла foreach. Я знаю, как подавить предупреждение, но я просто хотел понять, что может быть причиной этого?

1 Ответ

0 голосов
/ 08 октября 2019

Основываясь на комментариях кантона7, я понял, что при принудительном анализе кода с помощью меню «Анализ»> «Выполнить анализ кода» он принудительно использует старый двоичный файл fxcop , даже если вы установили новый пакет Roslyn Nuget * 1002. *. Новые анализаторы используются автоматически при сборке, и когда я использовал новые, предупреждение, упомянутое в вопросе, исчезло.

...