gpt4 book ai didi

c# - 为什么反射会为 lambda 返回如此奇怪的名称?

转载 作者:太空宇宙 更新时间:2023-11-03 17:56:15 28 4
gpt4 key购买 nike

我有这个代码:

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 查看绑定(bind)到 member 的对象内部时引用我看到MemberInfo.Name属性(property)有值(value)<Main>b__0 .

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

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

最佳答案

正在转换为委托(delegate)的 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# 编译器生成 unspeakable不是有效 C# 标识符的名称(以避免冲突,防止您直接访问它们等)。

关于c# - 为什么反射会为 lambda 返回如此奇怪的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10450311/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com