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

时间:2010-10-14 05:29:41

标签: c#

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

3 个答案:

答案 0 :(得分:53)

  

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

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

除非某些实际用户需要该功能是合理的,否则我们不会承担设计,实施,测试,记录和维护该功能的相当大的成本。

基本上,扩展方法旨在使LINQ工作。任何对LINQ工作没有贡献的东西都被削减了。 LINQ只需要静态,非泛型,非嵌套类中的扩展方法才能工作,这就是我们设计和实现的内容。

如果你有一个扩展方法在非静态,泛型或嵌套类中有用的场景,那么我很高兴看看这个场景。我们获得的现实场景越多,我们就越有可能在某些假设的未来语言中创建一个有利于这些场景的功能。

  

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

不,考虑它是一个好主意。如果我们不考虑它们,我们就会失职。我们仔细考虑了很长时间,并认为在此考虑的基础上,这项功能的成本并没有因所产生的利益而合理。

答案 1 :(得分:5)

正如Eric Lippert在他的博客中多次写过的那样,每次对C#的更改都是根据​​一系列标准进行仔细评估,以证明其合理性,而不仅仅基于技术。在这种情况下,启用LINQ不需要的是为了降低风险。请查看Eric的blog post以获得类似的问题。

答案 2 :(得分:3)

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

如果考虑泛型静态类场景,编译器必须尝试为所有可能的类型组合实例化具体类型,以匹配扩展方法。即使编译器可以聪明地执行此操作,实例化调用扩展方法的具体类型也可能具有开发人员可能不知道的副作用。