[英]C# inheritance in generics question
我有两个界面:
public interface A {
void aMethod();
}
public interface B : A {
void bMethod();
}
后来我基本上使用这样的字典:
Dictionary<int, A> dict = new Dictionary<int, B>();
C#表示即使我强制转换也无法从右向左转换。 有没有一种方法可以在C#中使用泛型,从而可以正常工作? 如果我使它们成为抽象类,那似乎还可以,但是我需要将它们作为接口。
您要查找的功能就是泛型方差(协方差和逆方差)。 从.net Framework 4开始,对此的支持有限。这是一个有趣的帖子: C#4.0中如何实现通用协方差和反方差?
这是有关泛型中协方差和协方差的MSDN条目 。
不,这是一个协方差问题。 如果可以的话:
Dictionary<int, A> dict = new Dictionary<int, B>();
没有编译器错误,就有可能将A类对象放入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/
这是他最喜欢谈论的话题之一,因此非常详尽。
我认为您不会找到解决问题的方法,因为其背后的想法似乎有缺陷。 为了说明,让我们创建另一个接口:
public interface C : A
{
void cMethod();
}
现在,让我们使用您的代码:
Dictionary<int, A> dict = new Dictionary<int, B>();
当我尝试以下操作时会发生什么?
C c = new ClassThatImplementsC();
dict.Add(1, c);
有关许多更多详细信息,请参阅Eric Lippert的协方差和相反方常见问题解答 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.