我想知道是否有存储在通用类型的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现在是一个接口)