首页 文章

C#Lambda退货声明问题

提问于
浏览
1

嘿所有,快速问题如何调用这个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 回答

  • 2

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

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

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

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

  • 2

    lambda是一个匿名函数 . 所以在你的情况下, ret 是函数的参数 .

    当你说的时候

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

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

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

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

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

相关问题