14

私は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; })()   );
4

3 に答える 3

29

はい。
デリゲートといいます。

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

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

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

あなたの編集された質問は意味がありません。

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

于 2011-07-28T22:07:01.063 に答える
5
void makeOutput(Func<int> _param)
{
    makeOutput(_param());
}

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

これはトリックを行うことができます!
それは単純な方法です:オーバーロード!

于 2011-07-28T22:07:17.957 に答える
4

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

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

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

于 2013-10-10T10:51:19.370 に答える