用于显式接口实现的扩展方法绑定

时间:2016-03-11 17:43:18

标签: c# .net extension-methods

我一直在玩扩展方法,以便为现有接口添加一些功能。当我隐式实现接口成员时,编译器选择接口成员实现而不是this MSDN页面中所述的扩展方法。

但是,当我尝试显式实现时,似乎选择了扩展方法而不是接口的已实现成员。

//My interface and extension method for this interface
interface IExt
{
    void Extended(int e);
}

public static int Extended(this yapboz.IExt ext, int e)
{
    return e + 1;
}

当我明确地实现给定的Extended方法(下面的CExt)时,它不会绑定。

class CExt : IExt
{
    void IExt.Extended(int e)
    {
        throw new NotImplementedException();
    }
}

在此实现之后,它返回整数值而不是抛出异常!

但是,当我隐式实现接口成员(见下文)时,我的代码抛出异常。

class CExt : IExt
{
    public void Extended(int e)
    {
        throw new NotImplementedException();
    }
}

1 个答案:

答案 0 :(得分:3)

必须通过接口调用显式实现。所以

IExt c = new CExt();
c.Extended(1);

将绑定到显式接口实现,因为该变量属于接口类型,但

CExt c = new CExt();
c.Extended(1);

将绑定到扩展方法,因为Extended类型本身没有公共CExt方法。

这就是为什么它的行为方式。但是我要注意,添加与现有接口方法相同的扩展方法并不是一个好主意。扩展方法用于扩展接口和类,而不是将实现添加到现有接口方法。