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

xpo*_*ort 32 c#

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

Eri*_*ert 54

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

作为PRATIK指出的,我们面临的问题不是"为什么扩展方法不能嵌套或泛型类允许吗?" 我们所面临语言设计者的问题是"为什么要扩展方法在嵌套或泛型类被允许?"

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

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

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

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

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

  • IMO这是一个非常短视的选择.或者选择被误导为不允许我直接在普通的C#类中声明扩展方法.有很多次我希望本地使用foo.ToBar()扩展方法,它在类之外没有相关性. (38认同)
  • @Bobson:注意到.我也想要这个功能.但是我注意到,自从我在2010年写下这个答案以来,我完成这项工作的能力大大降低了. (5认同)
  • 这是我需要此功能的好例子.因为我想用扩展方法建立一个流畅的界面,我希望这些扩展方法只在给定的类中可用. (2认同)

sof*_*eda 5

正如Eric Lippert在他的博客中多次写过的那样,对C#的每次改变都是根据一套标准进行仔细评估,以证明它是合理的,而不仅仅是基于技术.在这种情况下,启用LINQ不需要的是为了降低风险.查看Eric的这篇博客文章,提出类似的问题.