为什么反射会为lambda返回一个奇怪的名字?

sha*_*oth 1 .net c# reflection 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行它并使用watch来查看绑定到member引用的对象时,我看到该MemberInfo.Name属性具有值<Main>b__0.

这看起来很奇怪.为什么反思不会使用whatToDo名字?如果我在一个成员函数中有更多具有相同签名的操作怎么办 - 如何判断哪一个被报告?

为什么反射会返回这样一个奇怪的名字?

Jon*_*eet 9

正在转换为委托的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
    }
}
Run Code Online (Sandbox Code Playgroud)

...除了编译器足够智能以在必要时为捕获的变量创建新类等.在我的转换中调用额外的方法MyLambda,C#编译器生成不可写的名称,这些名称不是有效的C#标识符(以避免冲突,防止你直接访问他们等).

  • @BoltClock链接到我正在考虑的帖子,真棒:http://stackoverflow.com/questions/2508828/where-to-learn-about-vs-debugger-magic-names/2509524#2509524 (4认同)