当前位置: 首页 > 知识库问答 >
问题:

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

澹台华晖
2023-03-14

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

当我显式实现给定的扩展方法(下面是CExt)时,它不会绑定。

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

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

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

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

共有1个答案

段干俊茂
2023-03-14

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

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

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

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

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

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

 类似资料:
  • 问题内容: 我有以下类和接口: 我想创建一个方法,其中参数需要为BasicObject类型并实现CodeObject。我尝试了以下代码,但不能保证clazz是实现CodeObject的类。 我想做这样的事情,但不能编译: 问题答案: 您的模式类必须扩展和扩展/实现(实际上是一个接口)。您可以使用方法签名的通配符定义中声明的多个类来执行此操作,如下所示: 请注意,如果您通过以下任何一种方式进行操作,

  • 我有以下类和接口: 我想创建一个方法,其中参数需要是BasicObject类型,并实现CodeObject。我尝试了以下代码,但它不能保证clazz是一个实现CodeObject的类。 我想做这样的事情,但它无法编译:

  • 问题内容: 在Java中,当接口扩展另一个接口时: 为什么要实现其方法? 当接口不能包含方法主体时,如何实现其方法 当扩展另一个接口而不实现它时,如何实现这些方法? 接口实现另一个接口的目的是什么? 这是Java的主要概念! 编辑: 在eclipse中,除了中的实现方法之外,还有实现符号。 当我将鼠标悬停在它上面时,它表示它实现了该方法!!! 问题答案: 为什么要实现其方法?当接口不能包含方法主体

  • 但是现在,我希望这些接口实现也可用于扩展,例如。 我如何设置我的课程来实现这一点?(或者,反对这样做的固有缺陷或代码气味是什么?)

  • 本文向大家介绍Android实现扩展Menu的方法,包括了Android实现扩展Menu的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android实现扩展Menu的方法。分享给大家供大家参考。具体如下: 1. java代码: 2. java代码: 3. 运行结果: 希望本文所述对大家的Android程序设计有所帮助。

  • 本文向大家介绍详解C#中对于接口的实现方式(隐式接口和显式接口),包括了详解C#中对于接口的实现方式(隐式接口和显式接口)的使用技巧和注意事项,需要的朋友参考一下 C#中对于接口的实现方式有隐式接口和显式接口两种: 隐式地实现接口成员 创建一个接口,IChinese,包含一个成员 Speak;我们创建一个类Speaker,实现接口Chinese 这个就是隐式实现接口。 隐式实现调用方法如下: 都可