C # Lambda Возвращение Заявление Вопрос - PullRequest
1 голос
/ 02 декабря 2010

Привет всем, быстрый вопрос о том, как назвать эту лямбду или как она на самом деле ..

public Composite CreateBuffCheckAndCast(string name, UnitSelectDelegate onUnit, CanRunDecoratorDelegate extra)
{
    return new Decorator(
        ret => Spells.CanBuff(name, onUnit(ret)) && extra(ret),
        new Action(ret => Spells.Buff(name, onUnit(ret))));
}

К сожалению, остальной части этого класса нет, и я давно не использовал Lambdas. Откуда взялась эта переменная "ret"? Вызывающая функция? Используется ли он для захвата IEnumerable? Я мог видеть, как компилятор присваивает его любому типу, который примет onUnit ..?

Решение:

ret => используется для преобразования Spells.CanBuff в тип делегата, который будет принят Decorator. OnUnit также принимает параметр функции делегата.

Ответы [ 2 ]

2 голосов
/ 02 декабря 2010

Лямбда - это анонимная функция.Так что в вашем случае ret является параметром функции.

Когда вы говорите

Func<int, int> myFunc = (f) => f + 1;

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

int a = myFunc(4);   // a becomes 5

Action<T> - это делегат, который возвращает void и обычно указывает на лямбду, такую ​​как ваша.Func<T1, T2> - это делегат, который принимает T1 и возвращает T2, а также обычно указывает на лямбду.Есть другие делегаты, определенные для других методов, которые принимают больше параметров, таких как Func<T1, T2, T3> и Action<T1, T2>

В вашем случае вы передаете Decorator две анонимные функции.Когда он сочтет это необходимым, он вызывает их для выполнения некоторой работы и использует возвращаемое значение для дальнейшей работы.

2 голосов
/ 02 декабря 2010

Переменная ret - это параметр для делегата (или дерева выражений), который строит лямбда-выражение. Обратите внимание, что ret для первого лямбда-выражения отличается от ret от значения во втором лямбда-выражении.

Итак, создаются два делегата, и они передаются в конструктор Decorator, который, вероятно, сохраняет их для последующего выполнения. Когда вызывается каждый делегат, вызывающая сторона должна будет передать значение, которое будет доступно как параметр ret во время выполнения лямбда-выражения.

Не видя, что является подписью конструктора Decorator, трудно сказать что-либо еще.

Боюсь, я не совсем уверен, какова актуальность вашего второго фрагмента кода.

...