Примечание: Это похоже, но не совсем такой же, как this other questionICollection против ICollection <T> - неоднозначность между ICollection <T> .Count и ICollection.Count
Я реализовал интерфейс IBusinessCollection
. Он страдает от обоих ICollection<T>
, и старый-busted non-generic 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 способа сделать это компиляции, но все они уродливы.
В ролях класс это конкретная реализация (я не знаю)
В ролях класс явно
ICollection
Cast класс явно
ICollection<T>
Есть ли четвертый вариант, который не требует от меня вообще бросать вещи? Я могу сделать все изменения, мне нужно IBusinessCollection<T>
Почему бы не реализовать оба интерфейса явно, а общие напрямую? Он по-прежнему позволяет «программировать против интерфейса, а не против реализации» извне. –