c# - 当泛型类型定义既可以是值类型又可以是引用类型时,如何将泛型接口的对象添加到字典中?
问题描述
我有一个通用接口:
interface ITask<T>
{
T exec(T input);
}
这个通用接口是通过值类型和引用类型的类型定义实现的:
// interface implemented with value type `int`
class IntTask: ITask<int>
{
public int exec(int input)
{
// some code
return input;
}
}
//interface implemented with reference type `object`
class ObjectTask: ITask<object>
{
public object exec(object input)
{
// some code
return input;
}
}
我有这两个类的各种对象:
var intTask = new IntTask();
var objTask = new ObjectTask();
我想将这些对象收集到一个实例中 if IDictionary<string, X>
。而且我不确定该用于什么X
。
到目前为止我已经尝试过:
Dictionary<string, ITask<object>>
var taskList = new Dictionary<string, ITask<object>>();
taskList.Add("object", objTask);
taskList.Add("int", intTask);
这会产生以下错误:
'System.Collections.Generic.Dictionary>.Add(string, IntObjectTest.ITask)' 的最佳重载方法匹配有一些无效参数。
Dictionary<string, ITask<object>>
, 但键值对的值被转换为ITask<object>
taskList.Add("int", (ITask<object>)intTask);
这编译得很好,但会产生运行时错误:
无法将“IntObjectTest.IntTask”类型的对象转换为“IntObjectTest.ITask`1[System.Object]”类型。
Dictionary<string, ITask<dynamic>>
Dictionary<string, ITask<object>>
这与动态是在运行时解析的引用类型几乎相同,不能用于值类型。
所以我的问题归结为我可以使用什么泛型类型X
,以便可以使用引用类型和值类型来实现泛型方法/接口?我可以这样做吗?
解决方案
推荐阅读
- c# - 为什么这个 lambda 闭包虽然没有在运行时执行,但会产生垃圾?
- algorithm - 在 O(klogk+n) 中将 K 个元素插入到 N 个元素的排序列表中
- javascript - 未捕获的类型错误:无法读取未定义的 THREE.js 的属性“位置”
- python - 从元组列表中切片
- git - 使用 ColdFusion 的 Git 拉取/获取超时
- webpack - 查看 es6 模块导出/导入依赖
- matlab - 使用streamslice/quiver 和inpolygon 裁剪
- python - 执行此代码后不了解 a 和 b 的值
- lyft-api - 如何使用 Lyft API 访问起点-终点数据?
- python - 将简单 C++ 函数与 Python 接口的最快方法