2016-10-13 13 views
1

私の周りいじると、次はコンパイルされないだろうことに気づいた:(?)ネストされたラムダ構文

Func<int> a = ((j) => (() => 3 * j))(1); 

これは私には有効な文のように思えるし、次の同等のステートメントは、Pythonで動作します。

print (lambda x: lambda: 3 * x)(1)() 

これは、匿名関数がランタイムで処理される方法の結果ですか?

+1

コンパイラエラーを共有すると役立ちます。 – Bernhard

+0

ラムダを作成してすぐに呼び出すのは一般的に意味がないので、誰もこの種のサポートを実装していないという結果だけです。式を大幅に簡素化してコンパイルすることができます。 –

+1

それは確かに面白いですが、サイドノートでは、これはどのような実用的な使用ですか? –

答えて

4

これは、C#で可能なくかなりである - それは明示的なキャストと括弧がたくさん必要です。

Func<int> a = ((Func<int, Func<int>>)(j =>() => 3 * j))(1); 

または同様

Func<int, Func<int>> x = j =>() => 3 * j; 
Func<int> a = x(1); 

私はここに問題があると思いますがC#ではラムダの型を一般に推論することはできません - ラムダが割り当てられている型、変数、パラメータなどの型にラムダが一致することを確認するだけです。ご使用のバージョンでは、外側のラムダ(x)には型が指定されていません。

関連する問題