Как в ISet есть два метода Add (T item), которые различаются только типом возвращаемого значения? - PullRequest
8 голосов
/ 10 февраля 2012

Я знаю, что не могу перегрузить тип возвращаемого значения (кажется, я знаю это).

void F()
{
}

bool F()
{
   return true;
}

.. выдает ошибку already defines a member called 'F' with the same parameter types

Однако я читаю документацию для ISet от MSDN и думаю, что вижу два метода Add, которые различаются только типом возвращаемого значения.

Что здесь происходит?

Ответы [ 3 ]

4 голосов
/ 10 февраля 2012

Первый метод «Add» на самом деле ICollection<T>.Add, который наследуется.

Когда это реализовано в классе, должен быть явно реализован хотя бы один из двух Add методов, то есть:

void ICollection<T>.Add(T item)
{
   // ... Implement here
4 голосов
/ 10 февраля 2012

Другой метод Add - это явно реализованный метод интерфейса .

Когда метод интерфейса реализован явно, его нельзя вызвать без предварительной ссылки на тип интерфейса,что делает вызовы однозначными, и поэтому хорошо иметь несколько методов с одной и той же сигнатурой.

Чтобы сделать это в своем коде, вы должны сделать, например,

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

Это позволяет избежать необходимостипридумайте альтернативные имена методов, чтобы избежать коллизий с именами интерфейсов, когда вы хотите, чтобы метод интерфейса делал что-то немного отличное от другого метода.

3 голосов
/ 10 февраля 2012

Методы интерфейса могут быть реализованы явно, например так:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...