2009-10-12 3 views
5

Примечание: Это похоже, но не совсем такой же, как 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 способа сделать это компиляции, но все они уродливы.

  1. В ролях класс это конкретная реализация (я не знаю)

  2. В ролях класс явно ICollection

  3. Cast класс явно ICollection<T>

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

+0

Почему бы не реализовать оба интерфейса явно, а общие напрямую? Он по-прежнему позволяет «программировать против интерфейса, а не против реализации» извне. –

ответ

9

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

public interface IBusinessCollection<T> : ICollection<T>, ICollection 
{ 
    new int Count { get; } 
} 
+0

Это прекрасно работает. Благодаря! –

+1

PS. Не знал, что вы можете делать «новые» в интерфейсах. Это мило :-) –

-1
ICollection<string> counter = Factory.Get(); 
counter.Count; // No longer ambiguous 
+0

Я не думаю, что это действительно решает проблему. В моем примере кода я получаю ошибку неоднозначности с помощью 'var' или явного типа' IBusinessCollection '. – bobbymcr

+0

Вопрос запросил четвертый вариант. Он уже знал об этой возможности. –

+0

Я все еще ошибаюсь в двусмысленности. –

Смежные вопросы