泛型问题中的C#继承

Dan*_*phy 7 c# generics inheritance

我有两个接口:

public interface A { 
 void aMethod(); 
}


public interface B : A {
 void bMethod();
} 
Run Code Online (Sandbox Code Playgroud)

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

Dictionary<int, A> dict = new Dictionary<int, B>();
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*scu 11

您正在寻找的功能是所谓的泛型方差(协方差和逆变).在.net框架4中对此的支持有限.这里有一篇有趣的文章:如何在C#4.0中实现通用协方差和反差异?

这是关于泛型中协方差和反演MSDN条目.


kem*_*002 8

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

Dictionary<int, A> dict = new Dictionary<int, B>();
Run Code Online (Sandbox Code Playgroud)

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

问题是dict看起来像:Dictionary<int, A>但它确实是类型Dictionary<int, B>()(因此放置一个类型A的对象会因为无效的强制转换而抛出运行时错误),所以不应该让你甚至尝试放置一个A类对象在dict中,这就是为什么你不能这样做:

Dictionary<int, A> dict = new Dictionary<int, B>();
Run Code Online (Sandbox Code Playgroud)

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

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