Как устранить неоднозначность вызовов между Generic.IList <T>.this [] и IList.this []? - PullRequest
7 голосов
/ 11 сентября 2008

У меня есть коллекция, которая реализует интерфейс, расширяющий как IList , так и List.

public Interface IMySpecialCollection : IList<MyObject>, IList { ... }

Это означает, что у меня есть две версии индексатора.

Я хочу, чтобы универсальная реализация использовалась, поэтому я обычно ее реализую:

public MyObject this[int index] { .... }

Мне нужна только версия IList для сериализации, поэтому я реализую ее явно, чтобы скрыть ее:

object IList.this[int index] { ... }

Однако в моих модульных тестах следующее

MyObject foo = target[0];

приводит к ошибке компилятора

Звонок между следующие методы или свойства

Я немного удивлен этим; Я считаю, что я делал это раньше, и это прекрасно работает. Что мне здесь не хватает? Как можно заставить IList и IList сосуществовать в одном интерфейсе?

Редактировать IList делает не реализации IList, а I должен реализовать IList для сериализации. Меня не интересуют обходные пути, я хочу знать, чего мне не хватает.

Редактировать снова : Мне пришлось удалить IList из интерфейса и перенести его на мой класс. Я не хочу этого делать, так как классы, которые реализуют интерфейс, в конечном итоге будут сериализованы в Xaml, который требует коллекций для реализации IDictionary или IList ...

Ответы [ 5 ]

3 голосов
/ 11 сентября 2008

Вы не можете сделать это с

public interface IMySpecialCollection : IList<MyObject>, IList { ... }

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

public class MySpecialCollection : IList<MyObject>, IList { ... }

IList<object> myspecialcollection = new MySpecialCollection(); IList list = (IList)myspecialcollection;

Рассматривали ли вы, что IMySpecialCollection реализует ISerializable для сериализации? Поддержка нескольких типов коллекций кажется мне немного неправильной. Возможно, вы также захотите посмотреть на приведение yout IList в IEnumerable для сериализации, поскольку IList просто оборачивает IEnumerable и ICollection.

2 голосов
/ 03 ноября 2009

Это обманка мой вопрос здесь

Подводя итог, если вы делаете это, это решает проблему:

public Interface IMySpecialCollection : IList<MyObject>, IList
{
    new MyObject this[int index];
    ... 
}
1 голос
/ 11 сентября 2008

К сожалению, вы не можете объявить два индексатора с одним и тем же списком параметров. Следующий абзац взят отсюда Руководство по программированию в C # - Использование индексаторов Раздел «Замечания» :

Сигнатура индексатора состоит из количества и типов его формальных параметров. Он не включает тип индексатора или имена формальных параметров. Если вы объявляете более одного индексатора в одном классе, они должны иметь разные подписи.

Вам придется объявить другой набор параметров, если вы хотите использовать второй индексатор.

0 голосов
/ 11 сентября 2008

Измените общую реализацию на ...

T IList<T>.this[int index] { get; set; }

Это явно говорит, что "это" есть что.

0 голосов
/ 11 сентября 2008

Список подразумевает IList, поэтому не рекомендуется использовать оба в одном классе.

...