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