为什么非静态类中的静态方法不能作为扩展方法?
可能重复:
扩展方法要求类是静态的
在.NET中:
为什么非静态类中的静态方法不能作为扩展方法?
Eric Lippert可能会对这个问题给出一个非常好的答案,但它的要点可能是:
我们认为,如果我们限制你必须寻找扩展方法的位数,那么程序员和编译器都会更容易。
此策略倾向于强制用户将所有扩展方法放入为此目的指定的几个特定类中。
有意义的是,静态类需要具有扩展方法。 第一个原因是静态类是无状态的…即您不必实例化该类。 ……但这只是我的直觉。 否则对我来说没有意义。
我认为,强制扩展方法驻留在公共/内部静态类中也会降低使用它们的成本。
在编译时,只要对扩展方法使用实例语法sugar,就会将其转换为对静态方法(定义扩展)的调用,并传递给您的实例。
除了良好的语法之外,它与实现静态方法并将您的实例作为参数传递也没有什么不同。 这正是发生的事情。 您无法使用静态类执行此操作,因为您无法将静态类作为参数传递给方法。
因为,这就是它的方式。
我的猜测是允许静态扩展方法会使语言复杂化(每个function都会增加一种或另一种类型的复杂性),同时几乎不会增加任何好处。 例如,如果要在String
上定义静态方法,那么当您可以使用相同的静态方法定义自己的类时,这样做有什么好处?
实例级扩展方法很有用,因为它们可以处理类型实例的当前状态。 静态方法没有上下文,因此除了逻辑分组之外,它不会提供除在其他地方定义的静态方法的任何实用程序(即,定义String.IsNullOrFullOfSomeChar(char c)
在逻辑上有意义属于String
类,但除此之外没有优势。是的,这将是一个可怕的方法,只是一个例子)。
扩展方法是LINQ的结果。 它们的实现是为了让LINQ以设计师想要的方式工作。 不需要静态扩展,因此,它们没有实现。