匿名メソッドで再帰を実装する時

通常匿名メソッドを実装する時は、宣言と代入が同じになるパターンが多い。
例えば、下記のコードのように。

    public void 匿名メソッドで再帰()
    {
        Func<int, bool> カウントダウン = (x) =>
        {
            if (x == 0)
            {
                return true;
            }

            Console.WriteLine(x);
            x--;
            return カウントダウン(x);
        };

        カウントダウン(40);

    }

しかし、上記のコードだと、

未割り当てのローカル変数 'カウントダウン' が使用されました。

と言われてコンパイルエラーになる。


では、どうしたら良いかというと、先に匿名メソッドを代入する変数を宣言しておけばよい。
下記のコードならコンパイルエラーにならないで正しく動作する。

    public void 匿名メソッドで再帰()
    {
        Func<int, bool> カウントダウン = null;
        カウントダウン = (x) =>
        {
            if (x == 0)
            {
                return true;
            }

            Console.WriteLine(x);
            x--;
            return カウントダウン(x);
        };

        カウントダウン(40);

    }