CA2202 ForEach 循环警告

CA2202 Warning for ForEach loop

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();
    }
}

Warning CA2202 Object 'steps.GetEnumerator()' can be disposed more than once in method 'LoggingService.LogAnalysis(IEnumerable, bool)'. To avoid generating a System.ObjectDisposedException you should not call Dispose more than one time on an object.: Lines: 34

我做了一些研究,发现 nested using 语句和 Dispose 调用导致分析器 freak 发出此警告 ,但我既没有 explicit Dispose 调用也没有 using 块。我还没有遇到过针对 foreach 循环弹出此警告的其他情况。我知道如何抑制警告,但我只是想了解这可能是什么 原因

根据 canton7 的评论,我意识到当您使用菜单 Analyze>运行 Code Analysis 强制代码分析时,它会强制使用旧的二进制 fxcop ,即使您有安装了新的 Roslyn Nuget 包。新的分析器在构建时自动使用,当我使用新的分析器时,问题中提到的警告消失了。