2012-05-22 30 views
7

Aşağıdaki devralma hiyerarşi var:IDisposable ile arabirim mirası?

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

Ve bu kodu:

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

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

Ancak bu kod derleme yapmaz. Ancak

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

, IDisposable den IAddressRepository INHERITS bir üst: Bana bu hata mesajını verir.

Burada neler oluyor? Kodu nasıl derlerim?

+3

Bunu yeniden üretemiyorum –

+2

"AddressRepository" sınıfınızı görebilir miyiz - bu, düzgün bir şekilde uygulanıyorsa çalışmalıdır (değilse de farklı bir hata oluşmalıdır!). –

+0

AdresRepository tanımını gösterebilir misiniz? Şu anda sadece IAddressRepository’ı gösteriyorsunuz. – mbeckish

cevap

7

Benim tahminim bunu IDisposable devralan yapılmış beri IRepository<T> arayüzünü içeren montaj çekirdekler değil ya bir hata-yapıyoruz, yoksa bunun yanlış bir kopyasını başvuran veya diğer bazı IAddressRepository başvuran olmasıdır .

Temiz, sonra bir Rebuild All deneyin ve başvurularınızdaki yolları denetleyin. Projeler aynı çözümdeyse, DLL'yi değil, IRepository<T>/IAddressRepository'u içeren projeye başvurduğunuzdan emin olun. Ayrıca, AddressRepositoryIAddressRepository'un gerçekten uygulandığından emin olun. Sadece yanlış hatayı bildiriyor olabilir.

DÜZENLEME: Bu nedenle, çözüm, AddressRepository'un ana sınıfını içeren derlemenin derlenmemesi gibi görünüyor. Bu, hata ayıklayıcının, IDisposable'u uygulamaması nedeniyle, IDisposable'u uygulamamasından (sınıfının kendisini derleme hatası) "koruma düzeyi nedeniyle erişilemez" yerine, şikayet etmesine neden oldu. Benim tahminim de bu hatayı aldınız, ama önce bunu ele alıyorlardı. Benim için

2

İşleri:

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

İkinizin IAddressRepository arayüze sahip olabilir şüpheli. IRepository<T>'u genişleten ve IDisposable uzantısını genişleten Interfaces.IAddressRepository olduğundan emin misiniz?

İlgili konular