Почему я получаю Анализ кода CA1062 на параметр в этом коде?

У меня есть очень простой код (упрощенный из исходного кода - таким образом, я знаю, что это не очень умный код), что, когда я компилирую в Visual Studio, 2010 с Анализом кода дает мне предупреждающий CA1062: Проверьте аргументы открытых методов.

public class Foo
{
    protected static void Bar(out int[] x)
    {
        x = new int[1];
        for (int i = 0; i != 1; ++i)
            x[i] = 1;
    }
}

Предупреждение я добираюсь:

CA1062: Microsoft. Дизайн: Во внешне видимом методе 'Нечто. Панель (интервал [])', проверяют локальная переменная' (*x)', который был повторно присвоен от параметра 'x', перед использованием его.

Я не понимаю, почему я получаю это предупреждение и как я могу разрешить его, не подавляя его? Может new вернуть null? Действительно ли это - ошибка Visual Studio 2010 года?

ОБНОВЛЕНИЕ

Я решил открыть отчет об ошибках на Microsoft Connect.

8
задан brickner 19 May 2010 в 11:33
поделиться

2 ответа

Я воспроизвел это в Visual Studio 2010 Premium с точно таким же кодом и с включенными Microsoft All Rules в настройках анализа.

Похоже, это ошибка (см. Внизу здесь: http://msdn.microsoft.com/en-us/library/ms182182.aspx ). Выражается жалоба на то, что вы не проверяете, что x не является нулевым перед его использованием, но он находится в параметре out , поэтому нет входного значения для проверки!

8
ответ дан 5 December 2019 в 12:08
поделиться

Легче показать, чем описать:

public class Program
{
    protected static int[] testIntArray;

    protected static void Bar(out int[] x)
    {
        x = new int[100];
        for (int i = 0; i != 100; ++i)
        {
            Thread.Sleep(5);
            x[i] = 1; // NullReferenceException
        }
    }

    protected static void Work()
    {
        Bar(out testIntArray);
    }

    static void Main(string[] args)
    {
        var t1 = new Thread(Work);
        t1.Start();

        while (t1.ThreadState == ThreadState.Running)
        {
            testIntArray = null;
        }
    }
}

И правильный способ:

    protected static void Bar(out int[] x)
    {
        var y = new int[100];

        for (int i = 0; i != 100; ++i)
        {
            Thread.Sleep(5);
            y[i] = 1;
        }

        x = y;
    }
6
ответ дан 5 December 2019 в 12:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: