扩展方法需要声明类为静态。

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

1个回答

35

在C# 4规范的第10.6.9节中明确规定:

如果方法的第一个参数包含this修饰符,则该方法被称为扩展方法。 扩展方法只能声明在非泛型、非嵌套的静态类中。 扩展方法的第一个参数除了this修饰符外,不能有其他修饰符,并且参数类型不能是指针类型。

我不清楚为什么需要所有这些限制,除了可能是为了编译器(和语言规范)的简单性。 我可以理解将其限制为非泛型类型是有意义的,但我不能立即看出为什么它们必须是非嵌套和静态的。 我认为,如果您不必担心当前类型中包含的类型等,那么查找规则会变得更加简单,但我敢说这是可能的。

我怀疑,没有这些限制所带来额外的复杂性被认为比获得的好处要小。

编辑:仅此说明,我并不是建议将实例方法作为扩展方法 - 我建议在嵌套和/或非静态类中具有静态扩展方法是有意义的。


2
@Jon: 非静态实现怎么工作?调用会使用扩展方法类的哪个实例? - Adam Robinson
我同意Adam的观点,如果它不是静态的,那么如何确定要调用哪个特定实例?如果有多个实例会意味着什么? - Sam Holder
5
@Adam: 我并不是在建议使用非静态方法,而是在建议使用非静态类型会更合适。 - Jon Skeet
啊,这样更有意义。 - Adam Robinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接