扩展方法要求将类声明为静态

为什么扩展方法要求声明类是静态的? 这是编译器要求吗?

它取决于语言规范,C#4规范的第10.6.9节:

当方法的第一个参数包含this修饰符时,该方法被称为扩展方法。 扩展方法只能在非generics的非嵌套静态类中声明。 扩展方法的第一个参数除此之外不能有任何修饰符,参数类型不能是指针类型。

我不清楚为什么所有这些限制都是必要的 – 除了潜在的编译器(和语言规范)简单性。 我可以看到为什么将它限制为非generics类型是有意义的,但我不能立即明白为什么它们必须是非嵌套和静态的。 我怀疑如果你不必担心当前类型中包含的类型等,它会使查找规则变得相当简单,但我敢说它是可能的。

我怀疑没有这些限制的额外复杂性被认为低于获得的利益。

编辑:为了清楚,我并不是说将实例方法作为扩展方法是有意义的 – 我建议在嵌套和/或非静态类中使用静态扩展方法是有意义的。