Herencia de interfaz con IDisposable?
Frecuentes
Visto 1,677 veces
7
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?
2 Respuestas
7
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 AddressRepository
La 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
2
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 c# inheritance or haz tu propia pregunta.
¿Podemos ver tu
AddressRepository
clase: esto debería funcionar si se implementa correctamente (¡aunque debería ocurrir un error diferente si no es así!). - Grant Thomas¿Puedes mostrar la definición de AddressRepository? En este momento, solo muestra IAddressRepository. - mbeckish
¿Puedes agregar tu implementación de AddressRepository? - YavgenyP
De cualquier manera, probablemente valga la pena conservarlo en caso de que alguien más cometa el mismo error. - Chris Shain
@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. - Grant Thomas