2009-10-12 18 views
5

Nota: Questo è simile, ma non proprio la stessa di this other questionICollection vs ICollection <T> - ambiguità tra ICollection <T> Count e ICollection.Count

Ho implementato un'interfaccia IBusinessCollection. È dervies sia da ICollection<T> sia da quello non generico vecchio-ICollection. Preferirei fare uscire solo il vecchio sballato ICollection, ma sto usando WPF databinding con una CollectionView che mi vuole implementare il vecchio-sballato non generico IList :-(

In ogni caso, le interfacce di simile a questa:

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

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

public interface ICollection 
{ int Count { get; } } 

causa usando Dependency Injection, sto passando intorno agli oggetti di tipo IBusinessCollection<T> usando le loro interfacce, non da tipi concreti, in modo da avere qualcosa di simile:

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

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

Quando provo e chiamo questo codice, si ottiene un errore, come segue:

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

Ci sono 3 modi per rendere questo compilazione, ma tutti sono brutti.

  1. Fusioni la classe alla sua realizzazione concreta (che io non so)

  2. Fusioni classe esplicitamente ICollection

  3. Fusioni classe esplicitamente ICollection<T>

C'è una quarta opzione che non richiede che io scriva qualcosa? Posso fare tutte le modifiche che ho bisogno di IBusinessCollection<T>

+0

Perché non implementare entrambe le interfacce in modo esplicito e quelle comuni direttamente? Rende comunque possibile "programmare contro un'interfaccia, non contro un'implementazione" dall'esterno. –

risposta

9

Questo sembra risolvere i problemi nel mio test rapidi.

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

Ciò funziona perfettamente. Grazie! –

+1

PS. Non sapevo che potevi fare "nuovo" nelle interfacce. Bello :-) –

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

Non penso che questo risolva il problema. Nel mio codice di esempio, ottengo l'errore di ambiguità con 'var' o il tipo' IBusinessCollection 'esplicito. – bobbymcr

+0

La domanda ha richiesto una quarta opzione. Sapeva già di questa possibilità. –

+0

Ho ancora l'errore di ambiguità. –

Problemi correlati