我有两个界面:
public interface A {
void aMethod();
}
public interface B : A {
void bMethod();
}
后来我基本上使用这样的字典:
Dictionary<int, A> dict = new Dictionary<int, B>();
C#说我无法从右转换,即使我投了它。有没有办法在C#中使用泛型,以便这可以工作?如果我把它们作为抽象类,它似乎没问题,但我需要这些作为接口。
答案 0 :(得分:11)
您正在寻找的功能是所谓的泛型方差(协方差和逆变)。在.net框架4中对此的支持有限。这是一篇有趣的帖子:How is Generic Covariance & Contra-variance Implemented in C# 4.0?
答案 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);