ISet如何有两个Add(T项)方法,这些方法仅因返回类型而异?

时间:2012-02-10 00:53:34

标签: c# collections

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

void F()
{
}

bool F()
{
   return true;
}

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

但是,我正在阅读documentation for ISet from MSDN,我想我看到两个Add方法只会因返回类型而异。

这里发生了什么?

3 个答案:

答案 0 :(得分:4)

另一个Add方法是explicitly implemented interface method

当显式实现接口方法时,如果不先将接口类型的引用转换为接口方法,则无法调用它,这使得调用明确无误,因此具有相同签名的多个方法就可以了。

要在代码中执行此操作,例如

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

当你希望接口方法做的事情与其他方法略有不同时,这避免了必须提出备用方法名称以避免与接口名称冲突。

答案 1 :(得分:4)

第一个“添加”方法实际上是ICollection<T>.Add,它是继承的。

如果在类中实现,则需要明确实现两个Add方法中的至少一个,即:

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

答案 2 :(得分:3)

接口方法可以明确实现,如下所示:

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