Meh*_*ran 8 c# extension-methods static language-design
我知道C#扩展方法必须是静态的.我不明白为什么这些扩展不能在非静态类或通用类中定义?
更新:我对此设计决策背后的原因感兴趣.
这更像是一种观察而不是答案,但......
当您调用实例方法时,对您调用的对象的引用将作为方法调用中的第一个参数压入堆栈.第一个参数是"this"并且是隐式完成的.
定义扩展方法时,显式定义"this"作为第一个参数.
如果您可以在同一个类中定义扩展方法和实例方法,即定义具有相同名称的方法,并且实际上在包含"this"参数时使用相同的参数,则方法解析可能会令人困惑.
看一下 .NET C# 规范的这一部分:
当方法的第一个参数包含 this 修饰符时,该方法被称为扩展方法。扩展方法只能在非泛型、非嵌套的静态类中声明。扩展方法的第一个参数不能有除此之外的修饰符,并且参数类型不能是指针类型。
这个片段来自Jon Skeet 的回答:
我不清楚为什么所有这些限制都是必要的——除了可能是为了编译器(和语言规范)的简单性。我可以理解为什么将其限制为非泛型类型是有意义的,但我无法立即理解为什么它们必须是非嵌套和静态的。我怀疑如果您不必担心当前类型中包含的类型等,它会使查找规则变得相当简单,但我敢说这是可能的。
| 归档时间: |
|
| 查看次数: |
4465 次 |
| 最近记录: |