2
 static uint Fibonacci(uint n)
    {
        return n <= 1 ? n : Fibonacci(n - 1) + Fibonacci(n - 2);
    }

Func<uint> fibN = () => Fibonacci(n);
Func<int, int, int> add = (a, b) => a + b;

add 関数の構文を理解しています。int a および b パラメーターが「入る」 + b ステートメントの int 結果を返します。

しかし、なぜ fibN 関数に空のパラメーター block () があるのですか? n は、この関数にパラメータとして「行き」ませんか? この瞬間を理解するのを手伝ってください。

4

3 に答える 3

2

最初のラムダ:

Func<uint> fibN = () => Fibonacci(n);

パラメータはありません。変数 n が必要なため、現在ではコンパイルされません。この変数は、ラムダ パラメーターまたは現在のスコープのいずれかから取得できます。ラムダにはパラメーターがなく、現在のスコープの変数 n が存在しないため、コンパイルされません。

コンパイルするには、次のようにします。

uint n = 1; // Or any other value
Func<uint> fibN = () => Fibonacci(n);

注: 最初のラムダのような lambas ステートメントでは、現在のスコープに依存してそれらを実行しています。したがって、コンパイルされる匿名メソッドは静的ではありません。一方、2 番目のラムダ ステートメントは現在のスコープに依存せず (使用する変数はすべてラムダ パラメータであるため)、このラムダは静的な匿名メソッドにコンパイルされます。これは、ラムダ ステートメントがどのようにコンパイルされるかを理解するのに役立つ場合があります。基本的に、ラムダ ステートメントは通常の匿名メソッドにコンパイルされます。

于 2013-02-12T06:46:42.390 に答える
1

関数:

Func<uint> fibN = () => Fibonacci(n);

nがクラス変数であると仮定すると、次のように書き換えることができます。

private uint fibN() {
    return Fibonacci(n);
}

したがって、fibN は uint を返しますが、入力パラメーターは必要ありません。

于 2013-02-12T06:47:20.483 に答える