7

次の継承階層があります。

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ます。

ここで何が起きてるの?コードをコンパイルするにはどうすればよいですか?

4

2 に答える 2

7

私の推測では、あなたは間違いを犯しIRepository<T>IDisposableいるIAddressRepository.

Clean を実行してから Rebuild All を実行し、参照のパスを確認してください。プロジェクトが同じソリューション内にある場合は、DLL ではなくIRepository<T>/を含むプロジェクトを参照していることを確認してください。IAddressRepository

また、 がAddressRepository 実際に を実装 IAddressRepositoryしていることを確認してください。間違ったエラーを報告しているだけかもしれません。

AddressRepository編集:したがって、解決策は、の親クラスを含むアセンブリがコンパイルされていなかったようです。これにより、デバッガーは、クラス自体をコンパイルする (より賢明な) 「保護レベルのためにアクセスできません」というエラーではなく、AddressRepositoryを実装していないことについて文句を言いました。IDisposableあなたにもそのエラーがあったと思いますが、最初にこれに対処していました。

于 2012-05-22T15:25:37.987 に答える
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;
    }
}

インターフェースが 2 つあると思われますIAddressRepositoryInterfaces.IAddressRepositoryそれが extendsIRepository<T>であり、それが extends だと確信していますIDisposableか?

于 2012-05-22T15:29:34.090 に答える