C#中的接口inheritance

我正试图在写我的应用程序时遇到的问题(我)问题。 请看这个(我会尽量缩短代码):

我有一个名为IRepository根接口。 接下来, IBookRepository : IRepository接下来,实现它的具体类: BookRepository : IBookRepository

在RepositoryManager类中,我声明了private IRepository currentRepo;

IRepoItem是由Book类实现的接口。

现在,当我尝试做这样的事情时:

 currentRepo = new BookRepository(); 

VisualStudio提供错误消息:

无法将类型’BookRepository’隐式转换为’IRepository’。 存在显式转换(您是否错过了演员?)

我尝试显式转换,但抛出了运行时exception……

我知道(几乎可以肯定)它是一种叫做协方差的东西,这可能(可能)在.Net 4.0中解决了。 不幸的是我正在使用框架版本3.5编写,我无法改变它。 请给我一些建议 – 如何超支这个问题? 我想从RepoFactory获得currentRepo,它会产生几种存储库,具体取决于用户的需求。 我不知道这里是否允许链接,但是我在http://olgatherer.wordpress.com/上写了一些博客,我描述了应用程序创建。 我的英语不好,但我希望能理解我。 提前谢谢你的回答。

最好的问候,skrzeczowas

在.NET 3.5中,您绝对不能将IRepository视为IRepository

我们需要更多地了解您在RepositoryManager使用存储库的内容,以真正了解如何解决它…但是您是否可以创建IRepository扩展的非通用IRepository接口? 使它包含所有不引用T的成员。然后,您可以将currentRepo声明为IRepository

尝试使用中间层(IRep):

  interface IRepository { } interface IRep : IRepository where T : IRepoItem { } interface IBookRepository : IRep { } class BookRepository : IBookRepository { } 

然后你可以做你想做的事:

  BookRepository br = new BookRepository(); IRepository currentRepo = br; 

在.NET 3.5中,.NET 4中的IRepository和IRepository之间没有任何关系,你可以通过协方差和逆变支持实现类似的东西(但它取决于IRepository接口声明)

A会建议使用非通用的IRepository接口并自己进行转换。 我知道,这并不好,但你所描述的function需要协方差/逆变支持。