Lambda\Anonymous Function as a parameter

24,575

Solution 1

Yes.
It's called a delegate.

Delegates are (more-or-less) normal types; you can pass them to functions just like any other type.

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

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

Your edited question does not make sense.

C# is type-safe.
If the method doesn't want a function as a parameter, you cannot give it a method as a parameter.

Solution 2

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

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

This can do the trick!
It's the simples way : overloading!

Solution 3

I had similar problem and friend showed me the way:

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

Hope this will help

Share:
24,575
Focker
Author by

Focker

Updated on August 09, 2020

Comments

  • Focker
    Focker almost 4 years

    I'm a very new to C#. Just playing around with it. Not for a real purpose.

    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; }     );
    }
    

    Is it possible to use a REAL anonymous functions (means returning result)?

    I do not want to use delegates such as

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

    Also I DO NOT want to change method parameter type such as

    void makeOutput( Func<int> _param)
    {
    }
    

    That is very common decision.


    Everything is alright. I just understood that I wanted impossible things. I wanted to declare anonymous function and execute it in the same place. Note: DIRECT declaring and DIRECT call without generic wrapper.

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