为什么我不能在 C# 9 中定义顶级扩展方法?

Con*_*ell 4 c# c#-9.0

我曾认为在 C# 9中使用顶级语句功能本质上是将顶级代码包装在通常的Program类和Main方法中。

反编译的顶级程序如下所示:

[CompilerGenerated]
internal static class $Program
{
    private static void $Main(string[] args)
    {
        // top-level code here
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在顶层定义普通方法。它们被编译到Program类中,但在Main方法之外,也可以在其中定义扩展方法。

因为生成的Program类是静态的和非泛型的,我希望能够在顶层定义扩展方法。但是,我收到编译器错误CS1106: Extension method must be defined in a non-generic static class

VS Code 编译器错误 CS1106:必须在非泛型静态类中定义扩展方法

为什么是这样?

can*_*on7 9

C#语言规范说:

当方法的第一个参数包含this修饰符时,该方法被称为扩展方法。扩展方法只能在非泛型、非嵌套的静态类中声明。

根据语言规范,扩展方法必须在静态类中声明

通过将顶级方法放置在隐藏的静态类中来实现它们并不重要。顶级方法(根据定义)未在任何类中声明,因此不能是根据规范的扩展方法。

与所有语言设计问题一样,这是因为这是语言设计团队设计语言的方式。据推测,阻止您在非静态类中定义扩展方法的相同问题也适用于顶级方法。

如果您希望有更多权限的人提供更多详细信息,您可以在csharplang 存储库发起讨论或在 Gitter 上提问。

  • 讨论:https://github.com/dotnet/csharplang/discussions/4526 (2认同)