我想知道是否有存储在通用类型的Dictionary/List/...中的方法。

让我们想象一下这个类:

public class Registry{
    private Dictionary<String, MyGenericType<IContainableObject>> m_elementDictionary = new Dictionary<String, MyGenericType<IContainableObject>>();

    public void Register<T>(MyGenericType<T> objectToRegister)
    where T: IContainableObject
    {
        m_elementDictionary[objectToRegister.key] = objectToRegister; //This doesn't work
    }
}


我不明白为什么不能将这个元素添加到Dictionary中,因为我们知道由于where条件,我们收到的带有泛型类型的参数实际上是MyGenericType<IContainableObject>

请注意:


我知道我可以将接口放在MyGenericType<IContainableObject>上,以存储此字典。这是主题。
我知道我可以有一个MyGenericType<IContainableObject>参数,这也很重要。


我正在寻找协方差/协方差是否可以在这里提供帮助?

最佳答案

您应该这样表达where条件:

public void Register<T>(T objectToRegister)
    where T : MyGenericType<IContainableObject> {
    m_elementDictionary[objectToRegister.key] = objectToRegister;
}


此外,您应将MyGenericType定义为协变的,如以下示例所示:

interface IContainableObject {
}

public interface MyGenericType<out T> {
    string key();
}

interface IDerivedContainableObject : IContainableObject {
}

class Program {

    private static Dictionary<String, MyGenericType<IContainableObject>> m_elementDictionary = new Dictionary<String, MyGenericType<IContainableObject>>();

    public static void Register<T>(T objectToRegister)
        where T : MyGenericType<IContainableObject> {
            m_elementDictionary[objectToRegister.key()] = objectToRegister;
    }

    static void Main(string[] args) {
        MyGenericType<IDerivedContainableObject> x = null;
        MyGenericType<IContainableObject> y = x;
        Register(y);
    }

}


(请注意,MyGenericType现在是一个接口)

10-06 14:11