Herencia de interfaz con IDisposable?

Tengo la siguiente jerarquía de herencia:

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 se 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, un padre de IAddressRepository hereda de IDisposable.

¿Que está sucediendo aquí? ¿Cómo hago que el código compile?

preguntado el 22 de mayo de 12 a las 16:05

¿Podemos ver tu AddressRepository clase: esto debería funcionar si se implementa correctamente (¡aunque debería ocurrir un error diferente si no es así!). -

¿Puedes mostrar la definición de AddressRepository? En este momento, solo muestra IAddressRepository. -

¿Puedes agregar tu implementación de AddressRepository? -

De cualquier manera, probablemente valga la pena conservarlo en caso de que alguien más cometa el mismo error. -

@Oliver No puedes eliminarlo ahora que tiene una respuesta; Yo diría que la pregunta de respuesta y la respuesta también son valiosas. La respuesta de Chris podría incluso actualizarse para ser más explícita al responder qué era exactamente, ahora que lo sabemos. -

2 Respuestas

Supongo que está cometiendo un error, ya sea que no ha vuelto a compilar el ensamblaje que contiene el IRepository<T> interfaz desde que la hiciste heredar de IDisposable, o está haciendo referencia a una copia incorrecta, o está haciendo referencia a algún otro IAddressRepository.

Intente hacer una limpieza, luego reconstruir todo y verifique 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 AddressRepository realmente implementa IAddressRepository. Es posible que solo esté informando el error incorrecto.

EDITAR: Entonces, la resolución parece ser que la asamblea que contiene AddressRepositoryLa clase principal de no se estaba compilando. Esto hizo que el depurador se quejara de AddressRepository no implementando IDisposable, en lugar del error (más sensato) "inaccesible debido a su nivel de protección" al compilar la clase en sí. Supongo que también tuvo ese error, pero estaba abordando este primero.

contestado el 22 de mayo de 12 a las 16:05

Funciona para mi:

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;
    }
}

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

contestado el 22 de mayo de 12 a las 16:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.