ICollection vs ICollection <T>- Неопределенность между ICollection <T>.Count и ICollection.Count - PullRequest
6 голосов
/ 12 октября 2009

Примечание: это похоже, но не совсем так же, как этот другой вопрос

Я реализовал IBusinessCollection интерфейс. Это дериваты как от ICollection<T>, так и от неработающего старца ICollection. Я бы предпочел просто сбросить старый отключенный ICollection, но я использую привязку данных WPF с CollectionView, который хочет, чтобы я реализовал старый отключенный неуниверсальный IList: - (

В любом случае, интерфейсы выглядят так:

public interface IBusinessCollection<T> : ICollection<T>, ICollection
{ }

public interface ICollection<T>
{ int Count { get; } }

public interface ICollection
{ int Count { get; } }

Из-за использования Dependency Injection я передаю объекты типа IBusinessCollection<T> с использованием их интерфейсов, не по конкретным типам, поэтому у меня есть что-то вроде этого:

internal class AnonymousCollection : IBusinessCollection<string>
{ 
    public int Count { get { return 5; } }
}

public class Factory
{
    public static IBusinessCollection<string> Get()
    { return new AnonymousCollection(); }
}

Когда я пытаюсь вызвать этот код, я получаю сообщение об ошибке:

var counter = Factory.Get();
counter.Count; // Won't compile
// Ambiguity between 'ICollection<string>.Count' and 'ICollection.Count'

Есть 3 способа сделать этот компилятор, но все они безобразны.

  1. Приведите класс к его конкретной реализации (чего я не знаю)

  2. Приведите класс явно к ICollection

  3. Приведите класс явно к ICollection<T>

Есть ли четвертый вариант, который вообще не требует от меня кастовать вещи? Я могу внести любые необходимые изменения в IBusinessCollection<T>

Ответы [ 2 ]

10 голосов
/ 12 октября 2009

Это, кажется, решает проблемы в моих быстрых тестах

public interface IBusinessCollection<T> : ICollection<T>, ICollection
{
    new int Count { get;  }
}
0 голосов
/ 12 октября 2009
ICollection<string> counter = Factory.Get();
counter.Count; // No longer ambiguous
...