首页 > 解决方案 > 当泛型类型定义既可以是值类型又可以是引用类型时,如何将泛型接口的对象添加到字典中?

问题描述

我有一个通用接口:

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#generics

解决方案


推荐阅读