我希望有一个字典,从一个通用类型K<T>
映射到另一个通用类型V<T>
。请注意,在这两种情况下,类型T
应该相同。所以我想我会用Dictionary<K,V>
创建一个带有一个类型参数的派生类,但我找不到合适的语法。
这就是我的尝试:
1
class MyDictionary<T,K,V> : Dictionary<K<T>,V<T>> { ... }
// syntax error: The type parameter K cannot be used with type arguments.
// (same with V)
2
class MyDictionary<T,K<T>,V<T>> : Dictionary<K,V> { ... }
// many syntax errors: "," expected; "{" expected; ...
3
class MyDictionary<T,K,V> : Dictionary<K,V> { ... }
// works, but does not make the connection between K and T and between V and T
也许我可以使用一些where子句?
更好理解的一些例子:
MyDictionary<int,List,HashSet>
应该基本上是Dictionary<List<int>,HashSet<int>>
。
MyDictionary<float,Queue,Stack>
应该基本上是Dictionary<Queue<float>, Stack<float>>
。
答案 0 :(得分:1)
使用generic type constraints;根据您的示例,您可能希望确定两者的基类/接口。例如,以下内容适用于您的两种情况:
class MyDictionary<T,K,V> : Dictionary<K,V>
where K : IEnumerable<T>
where V : IEnumerable<T>
如果这不可行,即您需要能够在Action<String>
和IEqualityComparer<String>
之间存储映射,那么您将无法直接执行此操作;您最多可以在运行时检查泛型类型参数(例如,在您的类的构造函数中)。
答案 1 :(得分:-1)
似乎你需要这样的东西:
class ClassK<T> { }
class ClassV<T> { }
class MyComplexDictionary<T> : Dictionary<K<T>, V<T>> { }
它会阻止您添加错误键入的K&lt;&gt;实例。和V在编译时。
var a = new MyComplexDictionary<string>();
a.Add(new ClassK<string>(), new ClassV<string>()); //works
a.Add(new ClassK<int>(), new ClassV<string>()); // compilation error