Lambda-Expression 编译器代码生成

时间:2021-07-21 15:37:03

标签: c# lambda delegates language-design

以下包含 lambda 表达式的 C# 代码

public class MeClass 
{
    public void Main() 
    {
        Func<int> func = () => 12;
    }    
}

被编译器降低为

public class MeClass
{
    [Serializable]
    [CompilerGenerated]
    private sealed class <>c
    {
        public static readonly <>c <>9 = new <>c();

        public static Func<int> <>9__0_0;

        internal int <Main>b__0_0()
        {
            return 12;
        }
    }

    public void Main()
    {
        Func<int> func = <>c.<>9__0_0 ?? (<>c.<>9__0_0 = new Func<int>(<>c.<>9.<Main>b__0_0));
    }
}

https://sharplab.io/#v2:CYLg1APgAgTAjAWAFDKgZgASwwWQKYDCANgIYDOZGyA3shvVplACy4kCWAdgBQCUVSBhlqChDKAFYAPFwAuAPgwAzAK6cAxhgC8GPtsVwYAbjoMAvkORmgA=生成。

我知道我的委托实例 Func<int> func 将使用 Func<int> <>9__0_0 中的字段 <>c 的值进行初始化。
此字段将在 Func<int> func 初始化时初始化。
我的问题是,为什么 <>c 首先具有相同委托类型的字段。
为什么 Func<int> func 的值不直接设置为 new Func<int>(<>c.<>9.<Main>b__0_0)
我猜,Func<int> <>9__0_0 可以以某种方式重用,但我无法重现。

0 个答案:

没有答案
相关问题