c# - 字典的多态性

标签 c# .net generics

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

我有一个控件,需要在一个且仅一个特定词典中进行查找以绘制自身,但为了能够使用我的所有三个词典,我尝试指定该控件应采用等于的参数Dictionary<int, B> .但这没有用。

那么我的选择是什么?我希望我的控件能够处理 <int, B> 形式的所有词典.

最佳答案

像这样创建一个通用方法:

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。 ...

关于c# - 字典的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1449551/

相关文章:

c# - 以编程方式生成的数字签名电子邮件在 Outlook 中显示正确,但在 Gmail 中显示错误

c# - 如何恢复/中断 BackgroundWorker 线程

c# - 超出范围后进程仍在运行 - 这安全吗?

c# - Process.Start 很慢

c# - Microsoft Help Viewer 可以作为一个独立的应用程序使用吗?

c# - 年、月和日中 2 天之间的差异

java - 将 java 遗留代码转换为泛型——如何用类型替换对象?

generics - 如何使用未出现在第一个参数列表中的类型参数来改进 Scala 的类型推断?

c# - 通用对象需要强制转换,即使它实现了所需的接口(interface)

c# - 匹配和替换函数表达式