繁体   English   中英

泛型问题中的C#继承

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM