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 ,了解更多细节。