Question

J'ai un code très simple (simplifié du code original - donc je sais que ce n'est pas un code très intelligent) que lorsque je compile dans Visual Studio 2010 avec l'analyse du code me donne CA1062 avertissement: Valider les arguments des méthodes publiques

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

L'avertissement que je reçois:

  

CA1062: Microsoft.Design: Dans   Procédé extérieurement visible « Foo.Bar (out   int []) », valider la variable locale   '(X *)', qui a été réaffecté de   paramètre 'x', avant de l'utiliser.

Je ne comprends pas pourquoi je reçois cet avertissement et comment puis-je résoudre sans le supprimer? Peut new null de retour? Est-ce un bug Visual Studio 2010?

UPDATE

J'ai décidé d'ouvrir un rapport de bogue sur Microsoft Connect .

Était-ce utile?

La solution

Je l'ai reproduit dans Visual Studio 2010 Premium le code exactement comme donné et avec Microsoft Toutes les règles activé dans les paramètres d'analyse.

Il ressemble à ceci est un bug (voir en bas de ici: http: / /msdn.microsoft.com/en-us/library/ms182182.aspx ). Il est complainng que vous ne vérifiez pas que x est pas nul avant de l'utiliser, mais il est le paramètre out donc il n'y a pas de valeur d'entrée pour vérifier!

Autres conseils

Il est plus facile de montrer que de décrire:

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

Et la manière correcte est:

    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;
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top