语法:派生类型,嵌套泛型

时间:2017-09-04 11:42:38

标签: c# generics inheritance syntax nested

我希望有一个字典,从一个通用类型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>>

2 个答案:

答案 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