2012-05-22 17 views
7

Tengo la siguiente jerarquía de herencia:Herencia de interfaz con IDisposable?

public interface IRepository<T> : IDisposable 
{ 
    void Add(T model); 
    void Update(T model); 

    int GetCount(); 

    T GetById(int id); 
    ICollection<T> GetAll(); 
} 

public interface IAddressRepository : IRepository<Address> 
{ 
} 

Y este código:

var adrs = new Address[]{ 
    new Address{Name="Office"} 
}; 

using (IAddressRepository adrr = new AddressRepository()) 
    foreach (var a in adrs) 
     adrr.Add(a); 

Sin embargo, este código no compila. Me da este mensaje de error:

Error 43 
'Interfaces.IAddressRepository': type used in a using statement must be 
implicitly convertible to 'System.IDisposable' 

Sin embargo, uno de los padres de IAddressRepository hereda de IDisposable.

¿Qué está pasando aquí? ¿Cómo hago que compile el código?

+3

No puedo reproducir este –

+2

¿Podemos ver su clase 'AddressRepository'? Esto debería funcionar si se está implementando correctamente (¡aunque un error diferente debería ocurrir si no es así!). –

+0

¿Puedes mostrar la definición de AddressRepository? En este momento, solo está mostrando IAddressRepository. – mbeckish

Respuesta

7

Mi conjetura es que usted está haciendo un error- bien no se ha vuelto a compilar el conjunto que contiene la interfaz IRepository<T> desde que hizo que herede de IDisposable, o se hace referencia a la copia equivocada de ella, o se hace referencia a alguna otra IAddressRepository .

Pruebe hacer un Limpiar, luego un Reconstruir todo, y comprobar las rutas en sus referencias. Si los proyectos están en la misma solución, asegúrese de hacer referencia al proyecto que contiene IRepository<T>/IAddressRepository y no la DLL.

También asegúrese de que AddressRepositoryrealmente implementeIAddressRepository. Puede ser que simplemente esté informando el error equivocado.

EDITAR: Así que la resolución parece ser que el ensamblado que contiene la clase primaria de AddressRepository no se estaba compilando. Esto provocó que el depurador se quejara de que AddressRepository no implementaba IDisposable, en lugar de que el error (más razonable) "inaccesible debido a su nivel de protección" compilara la clase misma. Supongo que también tuviste ese error, pero te enfrentaste a este primero.

2

funciona para mí:

using System; 

public class Address {} 

public interface IRepository<T> : IDisposable 
{ 
    void Add(T model); 
    void Update(T model); 
} 

public interface IAddressRepository : IRepository<Address> 
{ 
} 

class Program 
{ 
    public static void Main() 
    { 
     using (var repo = GetRepository()) 
     { 
     } 
    } 

    private static IAddressRepository GetRepository() 
    { 
     // TODO: Implement :) 
     return null; 
    } 
} 

que sospecha que puede tener dos interfaces de IAddressRepository. ¿Está seguro de que es Interfaces.IAddressRepository que se extiende IRepository<T>, y que se extiende IDisposable?

Cuestiones relacionadas