2012-05-22 2 views
7

У меня есть следующая иерархия наследования:Наследование интерфейса с 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> 
{ 
} 

И этот код:

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

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

Однако этот код не компилируется. Это дает мне сообщение об ошибке:

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

Однако, головной IAddressRepository наследуется от IDisposable.

Что здесь происходит? Как сделать компиляцию кода?

+3

Я не могу воспроизвести это –

+2

Можем ли мы увидеть ваш класс «AddressRepository» - это должно работать, если оно выполняется правильно (хотя другая ошибка должна произойти, если это не так!). –

+0

Можете ли вы показать определение AddressRepository? Прямо сейчас, вы только показываете IAddressRepository. – mbeckish

ответ

7

Я предполагаю, что вы делаете mistake- либо вы не перекомпилировать сборку, содержащую интерфейс IRepository<T>, так как вы сделали это наследоваться от IDisposable, или вы ссылаетесь неправильную копию, или вы ссылаетесь некоторые другие IAddressRepository ,

Пробуйте очистить, а затем перестроить все и проверить пути по вашим ссылкам. Если проекты находятся в одном решении, убедитесь, что вы ссылаетесь на проект, содержащий IRepository<T>/IAddressRepository, а не на DLL.

Также убедитесь, что AddressRepositoryфактически реализуетIAddressRepository. Это может быть просто сообщение о неправильной ошибке.

РЕДАКТИРОВАТЬ: Таким образом, разрешение похоже на то, что сборка, содержащая родительский класс AddressRepository, не компилировалась. Это заставило отладчика жаловаться на то, что AddressRepository не реализует IDisposable, а не (более разумный) «недоступный из-за его уровня защиты» ошибку компиляции самого класса. Думаю, вы тоже ошиблись, но сначала обратились к этому.

2

работает для меня:

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

Я подозреваю, что вы можете иметь два IAddressRepository интерфейсов. Вы уверены, что это Interfaces.IAddressRepository, который расширяет IRepository<T>, и что это расширяет IDisposable?