为什么必须在静态类中定义C#扩展方法?

我知道C#扩展方法必须是静态的。 我不明白为什么这些扩展不能在非静态类或通用类中定义?

更新:我对此设计决策背后的原因感兴趣。

这更多的是观察而不是答案,但……

当您调用实例方法时,对您调用的对象的引用将作为方法调用中的第一个参数压入堆栈。 第一个论点是“这个”并且是隐含地完成的。

定义扩展方法时,显式定义“this”作为第一个参数。

如果您可以在同一个类中定义扩展方法实例方法,即定义具有相同名称的方法,并且实际上在包含“this”参数时使用相同的参数,则方法解析可能会令人困惑。

看一下这个.NET C#规范:

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

这个片段来自Jon Skeet的回答 :

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

因为规范是这么说的……现在可能有很好的理由让他们以这种方式编写规范。

它们不能在generics类中声明的原因很明显:给定调用扩展方法的方法,在哪里指定类的类型参数?

它必须是静态类的原因不太明显,但我认为这是有道理的。 静态类的主要用例是将辅助方法组合在一起(例如PathDirectoryProtectedData …),扩展方法基本上是辅助方法。 例如,能够创建EnumerableQueryable的实例是没有意义的。