2012-05-22 33 views
7

tôi có hệ thống phân cấp sau thừa kế:Giao tiếp kế thừa với 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> 
{ 
} 

Và mã này:

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

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

Tuy nhiên, mã này không biên dịch. Nó cung cấp cho tôi thông báo lỗi này:

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

Tuy nhiên, cha mẹ của IAddressRepository được kế thừa từ IDisposable.

Điều gì đang xảy ra ở đây? Làm cách nào để tôi biên dịch mã?

+3

Tôi không thể sao chép số này –

+2

Chúng tôi có thể thấy lớp 'AddressRepository' của bạn - điều này sẽ hoạt động nếu nó đang triển khai đúng cách (mặc dù có một lỗi khác xảy ra nếu không!). –

+0

Bạn có thể hiển thị định nghĩa của AddressRepository không? Ngay bây giờ, bạn chỉ đang hiển thị IAddressRepository. – mbeckish

Trả lời

7

tôi đoán là bạn đang thực hiện một mistake- hoặc bạn chưa biên dịch lại các hội đồng có chứa giao diện IRepository<T> kể từ khi bạn đã làm cho nó kế thừa từ IDisposable, hoặc bạn đang tham chiếu các bản sao sai của nó, hoặc bạn đang tham khảo một số khác IAddressRepository .

Thử làm sạch, sau đó xây dựng lại tất cả và kiểm tra đường dẫn trên tham chiếu của bạn. Nếu các dự án nằm trong cùng một giải pháp, hãy đảm bảo bạn đang tham chiếu dự án có chứa IRepository<T>/IAddressRepository và không phải là tệp DLL.

Cũng đảm bảo rằng AddressRepositorythực sự triển khaiIAddressRepository. Nó có thể chỉ báo cáo sai lỗi.

EDIT: Vì vậy, độ phân giải dường như là lắp ráp chứa lớp cha mẹ AddressRepository không biên dịch. Điều này gây ra trình gỡ rối để khiếu nại về AddressRepository không triển khai thực hiện IDisposable, thay vì lỗi (không hợp lý) "không thể truy cập được do mức độ bảo vệ" của nó biên dịch chính lớp đó. Đoán của tôi là bạn đã có lỗi đó quá, nhưng đã được giải quyết này đầu tiên.

2

trình cho tôi:

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

tôi nghi ngờ bạn có thể có hai IAddressRepository giao diện. Bạn có chắc chắn đó là Interfaces.IAddressRepository kéo dài IRepository<T> và mở rộng IDisposable?

Các vấn đề liên quan