为什么可以';非静态类中的静态方法是一个扩展方法

本文关键字:方法 扩展 一个 静态方法 静态类 为什么 | 更新日期: 2023-09-27 18:08:41

可能重复:
扩展方法要求类是静态

在.NET:中

为什么非静态类中的静态方法不能是扩展方法?

为什么可以';非静态类中的静态方法是一个扩展方法

Eric Lippert可能会对此给出一个非常好的答案,但其要点可能是:

我们决定,如果我们限制您必须查找扩展方法的位置数量,对程序员和编译器来说都会更容易。

此策略倾向于强制用户将其所有扩展方法放入为此目的指定的几个特定类中。

要求静态类具有扩展方法是有道理的。第一个原因是静态类是无状态的。。。即,您不必实例化该类。。。但这只是我的直觉。否则对我来说就没有意义了。

我也认为,强制扩展方法驻留在公共/内部静态类中可以降低使用它们的成本。

因为,好吧,事情就是这样。

我的猜测是,允许静态扩展方法会使语言复杂化(每个功能都会增加一种或另一种类型的复杂性(,同时几乎没有增加任何好处。例如,如果您在String上定义一个静态方法,那么当您可以简单地用相同的静态方法定义自己的类时,这样做有什么好处?

实例级扩展方法非常有用,因为它们处理类型实例的当前状态。静态方法没有上下文,因此与逻辑分组之外的其他地方定义的静态方法相比,它不会提供任何实用性(即,定义String.IsNullOrFullOfSomeChar(char c)在逻辑上属于String类是有意义的,但除此之外没有任何优势。是的,这将是一个可怕的方法,只是一个例子(。

扩展方法是LINQ的结果。它们的实现是为了让LINQ按照设计者想要的方式工作。不需要静态扩展,因此也没有实现它们。

在编译时,每当您为扩展方法使用实例语法sugar时,它都会转换为对静态方法(定义扩展(的调用,并通过您的实例。

除了漂亮的语法之外,它与实现静态方法和将实例作为参数传递没有什么不同。这正是发生的事情。静态类不能这样做,因为不能将静态类作为参数传递给方法。