为什么局部函数有“internal”访问修饰符?

Own*_*gic 8 c#

为什么 Roslyn 编译器生成带有internal访问修饰符(在 IL 中,assembly)而不是 的本地函数private

    private void M()
    {
        bool f = true;
        bool x1() => f;
        static bool x2() => true;
    }
Run Code Online (Sandbox Code Playgroud)
    .method assembly hidebysig static
        bool '<M>g__x1|0_0' (
            valuetype C/'<>c__DisplayClass0_0'& ''
        ) cil managed { ... }

    .method assembly hidebysig static
        bool '<M>g__x2|0_1' () cil managed { ... }
Run Code Online (Sandbox Code Playgroud)

锐实验室

文档说它应该是私有的: https: //learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/local-functions

本地函数是嵌套在另一个成员中的类型的私有方法。

由于所有本地函数都是私有的,包括访问修饰符(例如 private 关键字),会生成编译器错误 CS0106

Own*_*gic 0

看起来像是代码重用神器。Roslyn 可能使用相同的代码来处理本地函数和 lambda,但在不同的类中注入方法定义。

在 lambda 的情况下,它将 lambda 主体注入生成的闭包 ( DisplayClass) 类,并且它应该是内部的,以便从调用函数中引用。