繁体   English   中英

为什么反射会为lambda返回如此怪异的名称?

[英]Why does reflection return such a weird name for a lambda?

我有以下代码:

class Program
{
    static void Main(string[] args)
    {
        Action whatToDo = () => {
            var member = (MemberInfo)(MethodBase.GetCurrentMethod());
            Thread.Sleep(0); //whatever, need something to put a breakpoint on
        };
        whatToDo();
    }
}

当我运行它并使用监视功能查看绑定到member引用的对象的内部时,我看到MemberInfo.Name属性的值为<Main>b__0

这看起来很奇怪。 为什么反射不使用whatToDo名称? 如果在一个成员函数中有多个具有相同签名的动作,该怎么办-我怎么知道报告了哪个?

为什么这样怪异的名字是通过反射返回的?

将转换为委托的Lambda表达式转换为方法。 您的代码等效于:

class Program
{
    static void Main(string[] args)
    {
        Action whatToDo = MyLambda; // Method group conversion
        whatToDo();
    }

    static void MyLambda()
    {
        var member = (MemberInfo)(MethodBase.GetCurrentMethod());
        Thread.Sleep(0); //whatever, need something to put a breakpoint on
    }
}

...除了编译器足够聪明,可以在捕获的变量等所需的地方创建新类。在我的转换中,额外的方法称为MyLambda ,C#编译器会生成MyLambda名称 ,这些名称不是有效的C#标识符(为避免冲突,阻止您直接访问它们,等等)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM