C#Lambda退货声明问题

时间:2010-12-02 15:50:49

标签: c# lambda delegates anonymous-function

嘿所有,关于如何调用这个lambda或它实际上做什么的快速问题..

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 个答案:

答案 0 :(得分:2)

ret变量是lambda表达式构建的委托(或表达式树)的参数。请注意,第一个lambda表达式的ret与第二个lambda表达式中的ret不同。

因此,创建了两个委托,并将它们传递给Decorator构造函数,该构造函数可能存储它们以便稍后执行它们。调用每个委托时,调用者必须传递一个值,该值在lambda表达式执行期间可用作ret参数。

如果没有看到Decorator构造函数的签名是什么,那就很难说了。

我不太确定你的第二段代码的相关性是什么,我担心。

答案 1 :(得分:2)

lambda是一个匿名函数。因此,在您的情况下,ret是函数的参数。

当你说

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

您正在定义一个匿名函数,它接受一个int并返回它+ 1.您正在myFunc引用中存储对匿名函数的引用。此功能尚未执行,只是已定义。您可以随时调用该函数:

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

Action<T>是一个返回void的委托,通常指向像你这样的lambda。 Func<T1, T2>是一个委托,它接受T1并返回T2,并且通常也指向一个lambda。还有其他方法为其他方法定义了更多参数,例如Func<T1, T2, T3>Action<T1, T2>

在你的情况下,你正在处理装饰器两个匿名函数。当它认为必要时,它会调用它们为它做一些工作,并使用返回值来进一步完成它自己的工作。