Frage

Ich habe einen sehr einfachen Code (aus dem ursprünglichen Code vereinfachte - so dass ich weiß, es ist nicht ein sehr kluger Code), dass, wenn ich in Visual Studio 2010 mit Code-Analyse kompilieren gibt mir Warnung CA1062: Validate Argumente der öffentlichen Methoden

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

Die Warnung erhalte ich:

  

CA1062: Microsoft.Design: In   extern sichtbare Methode ‚Foo.Bar (out   int [])‘, validate lokaler Variable   '(* X)', die neu zugewiesen wurden aus   Parameter 'x', bevor Sie es.

Ich verstehe nicht, warum ich diese Warnung erhalten und wie kann ich es beheben, ohne sie zu unterdrücken? Kann Rückkehr new null? Ist das ein Visual Studio 2010 Bug?

UPDATE

Ich habe zu öffnen entschieden ein Fehlerbericht auf Microsoft Connect .

War es hilfreich?

Lösung

Ich habe das reproduzierte in Visual Studio 2010 Premium mit dem Code genau wie angegeben und mit Microsoft Alle Regeln aktiviert in den Analyseeinstellungen.

Es sieht aus wie dies ein Fehler ist (siehe hier unten: http: / /msdn.microsoft.com/en-us/library/ms182182.aspx ). Es ist complainng, dass Sie nicht, dass x Überprüfung vor der Verwendung nicht null ist, aber es ist auf out Parametern so gibt es keinen Eingabewert zu überprüfen!

Andere Tipps

Es ist einfacher, zu zeigen, als zu beschreiben:

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

Und der richtige Weg ist:

    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;
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top