2009-10-12 10 views
5

Nota: Esto es similar, pero no exactamente lo mismo que this other questionICollection vs ICollection <T> - La ambigüedad entre ICollection <T> .Count y ICollection.Count

he implementado una interfaz IBusinessCollection. Deriva de ambos ICollection<T>, y el viejo no buscó genérico ICollection. Yo prefiero volcar simplemente el viejo reventado ICollection, pero estoy usando WPF enlace de datos con un CollectionView el que quiere que implementan la edad de busto no genérico IList :-(

De todos modos, las interfaces se ven así:

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

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

public interface ICollection 
{ int Count { get; } } 

Debido a la utilización de la inyección de dependencias, que estoy pasando alrededor de los objetos de tipo IBusinessCollection<T> usando sus interfaces, no por tipos de hormigón, así que tener algo como esto:

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

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

Cuando intento llamar a este código, me sale un error, de la siguiente manera:

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

Hay 3 maneras de hacer esta compilación, pero todos ellos son feos.

  1. Reparto de la clase a la que es puesta en práctica concreta (que yo no lo sepa)

  2. Reparto de la clase explícitamente a ICollection

  3. Reparto de la clase explícitamente a ICollection<T>

¿Hay una cuarta opción que no me obligue a lanzar cosas? Puedo hacer los cambios que necesito IBusinessCollection<T>

+0

¿Por qué no implementar ambas interfaces explícitamente, y las comunes directamente? Todavía hace posible "programar contra una interfaz, no contra una implementación" desde el exterior. –

Respuesta

9

Esto parece resolver los problemas en mis pruebas rápidas.

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

Esto funciona perfectamente. ¡Gracias! –

+1

PS. No sabía que podía hacer 'nuevo' en las interfaces. Eso es bueno :-) –

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

No creo que esto realmente resuelva el problema. En mi código de muestra, obtengo el error de ambigüedad con 'var' o el tipo explícito' IBusinessCollection '. – bobbymcr

+0

La pregunta solicitó una cuarta opción. Él ya sabía acerca de esta posibilidad. –

+0

Todavía tengo la ambigüedad err. –

Cuestiones relacionadas