generics问题中的C#inheritance

我有两个接口:

public interface A { void aMethod(); } public interface B : A { void bMethod(); } 

后来我基本上使用这样的字典:

 Dictionary dict = new Dictionary(); 

C#说我无法从右转换,即使我投了它。 有没有办法在C#中使用generics,以便这可以工作? 如果我把它们作为抽象类,它似乎没问题,但我需要这些作为接口。

您正在寻找的function是所谓的generics方差(协方差和逆变)。 在.net框架4中对此的支持有限。这是一篇有趣的post: 如何在C#4.0中实现generics协方差和反差异?

这是关于generics中协方差和反演的MSDN条目 。

不,这是一个协方差问题。 如果你能做到:

 Dictionary dict = new Dictionary(); 

没有编译器错误就可以将类型A的对象放在dict中。

问题是dict看起来像: Dictionary但它实际上是类型Dictionary() (因此放置类型A的对象会因为无效的转换而抛出运行时错误),所以你不应该甚至不允许在dict中放置A类对象,这就是为什么你不能这样做:

 Dictionary dict = new Dictionary(); 

它可以保护您免受运行时错误的影响。
您想查看Eric Lippert关于此主题的博客: http : //blogs.msdn.com/b/ericlippert/

这是他最喜欢谈论的话题之一,所以它非常彻底。

我不认为你会找到解决问题的办法,因为它背后的想法似乎有缺陷。 为了说明,让我们创建另一个接口:

 public interface C : A { void cMethod(); } 

现在,让我们使用您的代码:

 Dictionary dict = new Dictionary(); 

当我尝试以下操作时会发生什么?

 C c = new ClassThatImplementsC(); dict.Add(1, c); 

请看看Eric Lippert的Covariance和Contravarience FAQ ,了解更多细节。