назад в школе, мы записали компилятор, где фигурные скобки имели поведение по умолчанию выполнения всех выражений и возвращения последнего значения..., таким образом, Вы могли записать что-то как:
int foo = { printf("bar"); 1 };
Действительно ли там что-то эквивалентно в C#? Например, если я хочу записать функцию лямбды, которая имеет побочный эффект.
Точка меньше являющееся о побочном эффекте лямбды (просто пример), больше если существует эта функциональность..., например, в шепелявости, у Вас есть зубец
В принципе, ответ от Влада правильный, и вам не нужно заранее объявлять лямбда-функцию в качестве делегата.
За исключением того, что в C # ситуация не так проста, поскольку компилятор не может решить, следует ли компилировать синтаксическое лямбда-выражение как делегат (например, Func
) или как дерево выражения (например, Expression
), а также может быть любым другим совместимым типом делегата. Итак, вам необходимо создать делегат:
int foo = new Func<int>(() => {
Console.WriteLine("bar"); return 1; })();
Вы можете немного упростить код, определив метод, который просто возвращает делегат, а затем вызывает метод - компилятор C # автоматически определит тип делегата:
static Func<R> Scope<R>(Func<R> f) { return f; }
// Compiler automatically compiles lambda function
// as delegate and infers the type arguments of 'Scope'
int foo = Scope(() => { Console.WriteLine("bar"); return 1; })();
Я согласен, что это это уродливый трюк, который не следует использовать :-), но интересно то, что это можно сделать!
Ничто не мешает вам иметь побочные эффекты в лямбда-выражении.
Func<int> expr = () =>
{
Console.WriteLine("bar");
return 1;
};
int foo = expr();
int foo = (() => { printf("bar"); return 1; })();
Изменить: спасибо за конструктивную критику, это должно быть
int i = ((Func<int>)(() => { printf("bar"); return 1; }))();
Мы рассматривали возможность сделать еще более краткий синтаксис, чем ()=>{M(); }
для определения лямбды, но так и не смогли найти синтаксис, который и читается хорошо, и не путается с блоками, инициализаторами коллекций/объектов или инициализаторами массивов. Пока что вы застряли с синтаксисом лямбд.
Вы говорите об анонимной функции: http://msdn.microsoft.com/en-us/library/bb882516.aspx , думаю.