1

我有这个代码:

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();
    }
}

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

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

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

4

1 回答 1

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
    }
}

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

于 2012-05-04T13:59:52.907 回答