У меня есть очень простой код (упрощенный из исходного кода - таким образом, я знаю, что это не очень умный код), что, когда я компилирую в 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.
Я воспроизвел это в Visual Studio 2010 Premium с точно таким же кодом и с включенными Microsoft All Rules в настройках анализа.
Похоже, это ошибка (см. Внизу здесь: http://msdn.microsoft.com/en-us/library/ms182182.aspx ). Выражается жалоба на то, что вы не проверяете, что x
не является нулевым перед его использованием, но он находится в параметре out
, поэтому нет входного значения для проверки!
Легче показать, чем описать:
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;
}