2016-10-20 2 views
0

として部分的なアプリケーションと機能を定義します。は、C#、以下の方法を検討し、デリゲート

int Foo(string st, float x, int j) 
{ 
    ... 
} 

を今私はパラメータstjの値を提供することにより、タイプFunc<float, int>のデリゲートでそれをラップします。しかし、私は構文を知らない。助けてもらえますか?

これはアイデア(ビットハスケルっぽい見えるかもしれません)です:トリックすればいい

Func<float, int> myDelegate = new Func<float, int>(Foo("myString", _ , 42)); 
// by providing values for st and j, only x is left as a parameter and return value is int 
+0

C#には部分アプリケーションはありません。関数呼び出しの引数はすべて指定する必要があります。しかし、(元の関数を呼び出す)「ラッピング関数」を作成することができます。 – user2864740

答えて

4

この:

Func<float, int> f = (x) => { return Foo("myString", x, 42); }; 

が部分的に関数を適用し、あなたがそれをやりたい方法が現在でありますC#ではなくF#でのみ可能です。

+0

あなたのコード行(私にとってはうまくいく)と以下の構文の違いはどこですか?私は 'void Bar(string st){...}'というメソッドを持っていて、今どこか 'Action a =(x)=> {return Bar(x); }; '。しかしここでは、コンパイラは「Delegate 'Action'は1つの議論をとらない」と不平を言う。しかし、議論は残っていません!この構文の何が問題になっていますか?上記とまったく同じです... – Kjara

+0

恐らくあなたはvoidを返すことができないし、Actionも何も返しません。 –

+0

しかし、 'Action a =(x)=> Bar(x);'は動作しません...(まだ "Delegate 'Action'は1つの引数を取っていません) – Kjara

3

部分的なアプリケーションには特別な構文はありません。あなたはそれが余分な割り当てが発生しますので、これは、あなたは、リソースに制約のあるアプリケーションでやりたい何かではないかもしれないことに注意してください

によって
Func<int, int, int, int> multiply = (a, b, c) => a*b*c; 
Func<int, int, int> multiplyPartialApplication = (a, b) => multiply(a, b, 100); 

それをエミュレートすることができます。

関連する問題