Лямбда \ Анонимная функция как параметр - PullRequest
14 голосов
/ 29 июля 2011

Я очень новичок в 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; }     );
}

Можно ли использовать РЕАЛЬНЫЕ анонимные функции (означает возвращать результат)?

Я не хочу использовать такие делегаты, как

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

    makeOutput( x())
}

Также я НЕ хочу менять тип параметра метода, такой как

void makeOutput( Func<int> _param)
{
}

Это очень распространенное решение.


Все в порядке.Я просто понял, что хочу невозможных вещей.Я хотел объявить анонимную функцию и выполнить ее там же.Примечание: прямое объявление и прямой вызов без универсальной оболочки.

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

Ответы [ 3 ]

30 голосов
/ 29 июля 2011

Да.
Это называется делегатом.

Делегаты (более или менее) нормальные типы; вы можете передавать их в функции, как и любой другой тип.

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

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

Ваш edit ed вопрос не имеет смысла.

C # является типобезопасным.
Если метод не хочет использовать функцию в качестве параметра, вы не можете присвоить ему метод в качестве параметра.

5 голосов
/ 29 июля 2011
void makeOutput(Func<int> _param)
{
    makeOutput(_param());
}

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

Это может помочь!
Это самый простой способ: перегрузка!

4 голосов
/ 10 октября 2013

У меня была похожая проблема, и друг показал мне путь:

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

Надеюсь, это поможет

...