嘿所有,快速问题如何调用这个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 回答
ret
变量是lambda表达式构建的委托(或表达式树)的参数 . 请注意,第一个lambda表达式的ret
与第二个lambda表达式中的ret
不同 .因此,创建了两个委托,并将它们传递给
Decorator
构造函数,该构造函数可能会存储它们以便稍后执行它们 . 调用每个委托时,调用者必须传递一个值,该值在lambda表达式执行期间可用作ret
参数 .如果没有看到
Decorator
构造函数的签名是什么,那就很难说了 .我不太确定你的第二段代码的相关性是什么,我担心 .
lambda是一个匿名函数 . 所以在你的情况下,
ret
是函数的参数 .当你说的时候
您正在定义一个带有int并返回它的匿名函数1.您正在
myFunc
引用中存储对匿名函数的引用 . 此功能尚未执行,只是已定义 . 您可以随时调用该函数:Action<T>
是一个返回void的委托,通常指向像你这样的lambda . aFunc<T1, T2>
是一个委托,它接受一个T1
并返回一个T2
,并且通常也指向一个lambda . 还有其他方法为其他方法定义了更多参数,例如Func<T1, T2, T3>
和Action<T1, T2>
在你的情况下,你正在装饰两个匿名函数 . 当它认为必要时,它会调用它们为它做一些工作,并使用返回值来进一步完成它自己的工作 .