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

toiithl6  于 2023-07-01  发布在  .NET
关注(0)|答案(2)|浏览(122)

我一直在尝试扩展方法,以便为现有接口添加一些功能。当我隐式实现接口成员时,编译器选择接口成员实现,而不是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();
    }
}
vwkv1x7d

vwkv1x7d1#

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

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

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

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

将绑定到扩展方法,因为CExt类型本身没有公共Extended方法。
所以这就是为什么它的行为方式。然而,我想指出的是,添加与现有接口方法相同的扩展方法并不是一个好主意。扩展方法用于 * 扩展 * 接口和类,而不是向现有接口方法添加实现。

sgtfey8w

sgtfey8w2#

显式实现是私有的。绑定不起作用,因为接口实现必须是公共的。在您的例子中,函数将恢复为扩展方法,因为它是公共的。

相关问题