Wil*_*sem 6 c# inheritance extension-methods multiple-inheritance
继承如何在C#中使用扩展方法.
假设你有一个接口IA,IB : IA而且IC,一个类Foo : IB, IC,现在定义一个扩展方法:
public static class Extensions {
    public static void Bar (this IA instance) {
        //Some code
    }
    public static void Bar (this IB instance) {
        //Some code
    }
    public static void Bar (this IC instance) {
        //Some code
    }
    public static void Bar (this Foo instance) {
        //Some code
    }
}
编译器如何确定行为Foo.Bar()?基于经验测试,编译器总是选择最具体的实例(如普通调用)而不使用动态绑定(因为this注释)更像是"语法"糖我想...
如果两个或多个类在继承层次结构中定义来自不同分支的方法,则调用是不明确的.在这种情况下,有没有办法定义一种方法优先于另一种方法?
上述声明是否正确?
继承确实很重要,但实际上更重要的是命名空间,来自C#规范:
如果调用的正常处理未发现适用的方法,则尝试将该构造作为扩展方法调用进行处理。
确切的过程和示例可以在C#规范中找到,7.6.5.2 Extension method invocations. 解析过程(其中C是可能的类型解析集,M是扩展方法集):
搜索 C 的过程如下:
• 从最接近的封闭命名空间声明开始,继续每个封闭命名空间声明,并以包含编译单元结束,连续尝试寻找一组候选的扩展方法:o 如果给定的命名空间或编译单元直接包含具有合格扩展方法 Mj 的非泛型类型声明 Ci,则这些扩展方法的集合是候选集。
o 如果在给定的命名空间或编译单元中使用命名空间指令导入的命名空间直接包含具有合格扩展方法 Mj 的非泛型类型声明 Ci,则这些扩展方法的集合是候选集。
• 如果在任何封闭的命名空间声明或编译单元中找不到候选集,则会发生编译时错误。
• 否则,如(第 7.5.3 节)中所述,将重载决议应用于候选集。如果找不到单一的最佳方法,则会发生编译时错误。
• C 是将最佳方法声明为扩展方法的类型。使用 C 作为目标,然后将方法调用作为静态方法调用进行处理(第 7.5.4 节)。
如果我理解正确,这意味着它在编译时选择最近命名空间中的最佳扩展方法。理解没有动态调用是非常重要的,解析是静态完成的(即在编译时)。