2009-10-12 18 views
5

Hinweis: Dies ist ähnlich, aber nicht ganz dasselbe wie this other questionICollection vs ICollection <T> - Ambiguität zwischen ICollection <T> .Count und ICollection.Count

ich eine IBusinessCollection Schnittstelle implementiert haben. Es stammt sowohl von ICollection<T>, als auch von dem altbusigen Nicht-Generikum ICollection. Ich würde es vorziehen, nur die alte Dump gesprengt ICollection, aber ich bin mit WPF Datenbindung mit einem Collection die mir die alten kaputten nicht-generic IList :-(

Auf jeden Fall umsetzen will, sehen die Schnittstellen wie folgt aus:

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

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

public interface ICollection 
{ int Count { get; } } 

Aufgrund Dependency Injection mit, ich bin, das um Objekte vom Typ IBusinessCollection<T> ihre Schnittstellen, nicht von konkreten Typen, also habe ich so etwas wie dieses:

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

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

Wenn ich diesen Code versuchen, und rufen, bekomme ich einen Fehler wie folgt:

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

Es gibt 3 Möglichkeiten, um diese Kompilierung zu machen, aber alle von ihnen sind hässlich.

  1. Cast die Klasse, es ist die konkrete Umsetzung (was ich nicht wissen kann)

  2. die Klasse explizit ICollection

  3. Guss die Klasse explizit ICollection<T>

Cast Gibt es eine vierte Option, bei der ich überhaupt keine Rolle spielen muss? Ich kann, was Änderungen vornehmen muss ich IBusinessCollection<T>

+0

Warum nicht beide Schnittstellen explizit und die gemeinsamen direkt implementieren? Es macht es immer noch möglich, "von außen gegen eine Schnittstelle, nicht gegen eine Implementierung zu programmieren". –

Antwort

9

Dies scheint die Probleme in meiner schnellen Tests zu lösen.

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

Dies funktioniert perfekt. Vielen Dank! –

+1

PS. Wusste nicht, dass man an Schnittstellen "neu" machen kann. Das ist schön :-) –

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

Ich glaube nicht, dass dies tatsächlich das Problem löst. In meinem Beispielcode erhalte ich den Mehrdeutigkeitsfehler mit "var" oder dem expliziten "IBusinessCollection " -Typ. – bobbymcr

+0

Die Frage hat eine vierte Option angefordert. Er wusste bereits von dieser Möglichkeit. –

+0

Ich bekomme immer noch die Mehrdeutigkeit err. –

Verwandte Themen