泛型问题中的C#继承

时间:2010-11-10 16:42:29

标签: c# generics inheritance

我有两个界面:

public interface A { 
 void aMethod(); 
}


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

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

Dictionary<int, A> dict = new Dictionary<int, B>();

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

3 个答案:

答案 0 :(得分:11)

您正在寻找的功能是所谓的泛型方差(协方差和逆变)。在.net框架4中对此的支持有限。这是一篇有趣的帖子:How is Generic Covariance & Contra-variance Implemented in C# 4.0?

这是MSDN entry on Covariance and Contravariance in Generics

答案 1 :(得分:7)

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

Dictionary<int, A> dict = new Dictionary<int, B>();

在没有编译器错误的情况下将类型A的对象放在dict中是可能的。

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

Dictionary<int, A> dict = new Dictionary<int, B>();

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

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

答案 2 :(得分:0)

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

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

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

Dictionary<int, A> dict = new Dictionary<int, B>();

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

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

请查看Eric Lippert's Covariance and Contravarience FAQ了解更多详情。