首页 > 解决方案 > 为什么本地函数具有“内部”访问修饰符?

问题描述

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

    private void M()
    {
        bool f = true;
        bool x1() => f;
        static bool x2() => true;
    }
    .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 { ... }

夏普实验室

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

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

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

标签: c#

解决方案


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

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


推荐阅读