为什么我不能在C#9中定义顶级扩展方法?
c#
c#-9.0
我曾认为在 C# 9中使用顶级语句功能本质上是将顶级代码包装在通常的Program类和Main方法中。
反编译的顶级程序如下所示:
[CompilerGenerated]
internal static class $Program
{
private static void $Main(string[] args)
{
// top-level code here
}
}
您可以在顶层定义普通方法。它们被编译到Program类中,但在Main方法之外,也可以在其中定义扩展方法。
因为生成的Program类是静态的和非泛型的,我希望能够在顶层定义扩展方法。但是,我收到编译器错误CS1106: Extension method must be defined in a non-generic static class
为什么是这样?
回答
在C#语言规范说:
当方法的第一个参数包含
this修饰符时,该方法被称为扩展方法。扩展方法只能在非泛型、非嵌套的静态类中声明。
根据语言规范,扩展方法必须在静态类中声明。
通过将顶级方法放置在隐藏的静态类中来实现它们并不重要。顶级方法(根据定义)未在任何类中声明,因此不能是根据规范的扩展方法。
与所有语言设计问题一样,这是因为这是语言设计团队设计语言的方式。据推测,阻止您在非静态类中定义扩展方法的相同问题也适用于顶级方法。
如果您希望有更多权限的人提供更多详细信息,您可以在csharplang 存储库中发起讨论或在 Gitter 上提问。
- Discussion: https://github.com/dotnet/csharplang/discussions/4526