10

私は非常に単純なコードを持っています(元のコードから単純化されているので、それほど賢いコードではないことがわかります)。コード分析を使用して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.Design:外部から見えるメソッド'Foo.Bar(out int [])'で、使用する前に、パラメーター'x'から再割り当てされたローカル変数'(* x)'を検証します。

なぜこの警告が表示されるのか、それを抑制せずに解決するにはどうすればよいのかわかりません。new戻ることができますnullか?これはVisualStudio2010のバグですか?

アップデート

MicrosoftConnectでバグレポートを開くことにしました。

4

2 に答える 2

9

Visual Studio 2010 Premiumで、指定されたとおりのコードを使用し、分析設定でMicrosoftAllRulesを有効にしてこれを再現しました。

これはバグのようです(ここの下部を参照してください:http://msdn.microsoft.com/en-us/library/ms182182.aspx)。x使用する前にnullでないことをチェックしていないと不平を言っていますが、outパラメーター上にあるため、チェックする入力値がありません。

于 2010-05-18T20:42:25.100 に答える
7

説明するよりも表示する方が簡単です:

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;
    }
于 2010-05-18T21:01:48.043 に答える