代码之家  ›  专栏  ›  技术社区  ›  Display Name Camilo Terevinto

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

c#
  •  31
  • Display Name Camilo Terevinto  · 技术社区  · 15 年前

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

    3 回复  |  直到 15 年前
        1
  •  53
  •   Eric Lippert    15 年前

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

    正如普拉蒂克指出的,我们面临的问题不是“为什么扩展方法 不 允许在嵌套类或泛型类中使用?“作为语言设计师,我们面临的问题是“为什么 应该 是否允许在嵌套类或泛型类中使用扩展方法?“

    除非这个特性被一些真实的用户需求证明是合理的,否则我们不会承担设计、实现、测试、记录和维护这个特性的相当大的成本。

    基本上,扩展方法是为了使LINQ工作而设计的。任何不利于Linq工作的东西都被切断了。Linq只需要静态、非泛型、非嵌套类中的扩展方法就可以工作,所以这就是我们设计和实现的。

    如果您有一个场景,其中扩展方法在非静态类、泛型类或嵌套类中很有用,那么我很乐意看看这个场景。我们得到的真实场景越多,我们就越有可能用一些假设的未来语言制作一个有利于这些场景的特性。

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

    不,考虑一下是个好主意。如果我们不考虑这一点,我们的职责就会被免除。我们仔细考虑了很长一段时间,并决定在考虑到这一点的基础上,做这一功能的成本不能由应计的收益来证明。

        2
  •  5
  •   softveda    15 年前

    正如埃里克·利珀特在他的博客中写过很多次的那样,每一次对C的改变都是根据一系列标准来仔细评估的,以证明它的合理性,而不是仅仅基于技术上的考虑。在这种情况下,为了降低风险,不需要启用LINQ。检查这个 blog post 埃里克也提出了类似的问题。

        3
  •  3
  •   VinayC    15 年前

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

    如果考虑通用静态类方案,编译器必须尝试为所有可能的类型组合实例化具体类型,以便与扩展方法匹配。即使编译器可以做到这一点,实例化用于调用扩展方法的具体类型可能会产生开发人员可能不知道的副作用。