ISet如何有两个Add(T项)方法,它们只因返回类型而异

本文关键字:返回类型 方法 ISet Add 两个 | 更新日期: 2023-09-27 18:23:53

我知道我不能重载返回类型(我想我知道这一点)。

void F()
{
}
bool F()
{
   return true;
}

产生错误already defines a member called 'F' with the same parameter types

然而,我正在阅读MSDN中的ISet文档,我想我看到了两个Add方法,它们只因返回类型而异。

这是怎么回事?

ISet如何有两个Add(T项)方法,它们只因返回类型而异

第一个"Add"方法实际上是继承的ICollection<T>.Add

当这在类中实现时,需要显式实现两个Add方法中的至少一个,即:

void ICollection<T>.Add(T item)
{
   // ... Implement here

另一个Add方法是显式实现的接口方法。

当一个接口方法被显式实现时,如果不首先强制转换对接口类型的引用,就无法调用它,这使得调用不明确,因此拥有多个具有相同签名的方法是可以的。

要在代码中做到这一点,您可以这样做,例如

class MyCollection<T> : ICollection<T> {
    public void Add() { ... }
    void ICollection<T>.Add() { ... }
}

当您希望接口方法与其他方法做一些稍微不同的事情时,这就避免了必须使用备用方法名称来避免与接口名称发生冲突。

接口方法可以显式实现,如下所示:

public class Something : IINterface1, IInterface2
{
    public bool DoSomething();
    public void IInterface2.DoSomething();
}

现在,返回void的方法只有在将类强制转换为接口时才可访问:

Something s = new Something();
IInterface2 i = (IInterface2)s;
i.DoSomething(); // method returning void