为什么扩展方法只允许在非嵌套的非generics静态类中使用?

为什么扩展方法只允许在非嵌套的非generics静态类中使用? 在嵌套generics静态类中考虑扩展方法是无用的吗?

为什么扩展方法只允许在非嵌套的非generics静态类中使用?

正如Pratik指出的那样,我们面临的问题不是“为什么嵌套或generics类中不允许扩展方法?” 我们作为语言devise者面临的问题是“为什么应该在嵌套或generics类中允许扩展方法?”

除非function是由一些真实的用户需求所certificate的,否则我们不会承担devise,实现,testing,logging和维护function的相当大的成本。

基本上,扩展方法的devise是为了使LINQ的工作。 任何对LINQ工作没有贡献的东西都被削减了。 LINQ只需要静态,非generics,非嵌套类中的扩展方法来工作,这就是我们devise和实现的。

如果你有一个扩展方法在非静态类,generics类或嵌套类中有用的场景,那么我很高兴看一下这个场景。 我们得到的实际情景越多,我们就越有可能在某种假设的未来语言中使用这些特性,从而使这些情景受益。

在嵌套generics静态类中考虑扩展方法是无用的吗?

不,这是一个好主意。 如果我们没有考虑,我们会对我们的职责感到失职。 我们仔细考虑了很长一段时间,并决定在这个考虑的基础上,做这个function的成本是没有理由的积累的好处。

正如Eric Lippert在他的博客中多次写过的,每一次对C#的改变都是根据一系列标准进行仔细评估,以certificate它的正确性,而不是单纯以技术为基础。 在这种情况下,不需要启用LINQ的function被切断,以降低风险。 从埃里克检查这个博客文章也有类似的问题。

我相信这样做是为了让编译器能够在合理的时间内定位/search扩展方法。 此外,请注意,编译器search扩展方法只在文件范围内的一组命名空间中 – 这也是由于类似的原因。

如果您考虑generics静态类scheme,编译器必须尝试实例化所有可能types组合的具体types,以匹配扩展方法。 即使编译器可以做到这一点聪明,实例化调用扩展方法的具体types可能有开发人员可能不知道的副作用。