与字典的多态性

时间:2009-09-19 21:16:12

标签: c# .net generics

我有一个基类型,从中继承了3个不同的对象。让我们调用基础对象B,继承X,Y和Z.现在我的字典有一个int作为键,分别是X,Y,Z作为值。

我有一个控件,需要在一个且只有一个特定字典中进行查找以绘制自己,但是为了能够处理我的所有三个字典,我尝试指定控件应该采用等于的参数Dictionary<int, B>。但这不起作用。

那么我的选择是什么?我希望我的控件可以使用<int, B>形式的所有词典。

1 个答案:

答案 0 :(得分:7)

制作如下通用方法:

public void DoSomething<T>(IDictionary<int, T> dictionary) where T : B

或类似地使控件本身通用(这会给你的设计师带来问题,但是......)

public class MyControl<T> where T : B
{
    private IDictionary<int, T> dictionary;
    ...
}

由于通用不变性,您需要执行此操作。即使在C#4(支持某些方差)中,这也是不变的:字典使用输入输出的值。

想象一下,您可以从Dictionary<int, X>转换为Dictionary<int, B>。然后你就可以写下:

dictionary[0] = new B();

...这显然不适用于字典,因为它不是X ......