web-dev-qa-db-ja.com

パラメータとしてのLambda \ Anonymous Function

私はC#を初めて使用します。それで遊んでください。本当の目的ではありません。

void makeOutput( int _param)
{
    Console.WriteLine( _param.ToString());
}

//... 
// Somewhere in a code
{
    makeOutput(     /* some not c# code for an example for what do I want */ function : int () { return 0; }     );
}

REAL無名関数(結果を返すことを意味します)を使用することは可能ですか?

次のようなデリゲートを使用したくない

// Somewhere in a code
{
    Func<int> x = () => { return 0; };

    makeOutput( x())
}

また、次のようなメソッドパラメータタイプを変更したくない

void makeOutput( Func<int> _param)
{
}

それは非常に一般的な決定です。


すべてが正常である。不可能なことをしたいということを理解しました。無名関数を宣言して同じ場所で実行したかったのです。注:汎用ラッパーを使用しないDIRECT宣言およびDIRECT呼び出し。

// flash-like (as3) code    /// DOES NOT COMPILE
makeOutput(    (function : int(){ return 0; })()   );
14
Focker

はい。
これはデリゲートと呼ばれます。

デリゲートは(多かれ少なかれ)通常のタイプです。他のタイプと同じように、それらを関数に渡すことができます。

void makeOutput(Func<int> param) {
    Console.WriteLine(param());
}

makeOutput(delegate { return 4; });
makeOutput(() => { return 4; });
makeOutput(() => 4);

君の 編集edの質問は意味がありません。

C#はタイプセーフです。
メソッドが関数をパラメーターとして必要としない場合、メソッドをパラメーターとして指定することはできません。

30
SLaks
void makeOutput(Func<int> _param)
{
    makeOutput(_param());
}

void makeOutput(int _param)
{
    Console.WriteLine( _param.ToString());
}

これでうまくいきます!
それは簡単な方法です:オーバーロード!

5
Vercas

私も同様の問題を抱えていて、友人が道を教えてくれました。

makeOutput((new Func<Int32>(() => { return 0; })).Invoke());

これが役立つことを願っています

4
pen2