2017-09-04 153 views
1

我想要一個字典,從一個通用類型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>>

回答

1

使用generic type constraints;根據你的例子,你可能想要解決這兩個基類/接口。例如,下面將工作您的兩個案例:

class MyDictionary<T,K,V> : Dictionary<K,V> 
    where K : IEnumerable<T> 
    where V : IEnumerable<T> 

如果這不可行,即你需要能夠存儲Action<String>IEqualityComparer<String>之間,也就是說,映射,你將不能夠做到直接;你最多可以在運行時檢查泛型類型參數(例如在你的類的構造函數中)。

+0

你的K是不同的類型。你的V也是。 –

+0

@ Dennis_E不,我的一個「K's」是一個類型,另一個是泛型​​類型參數。我的「V's」也是如此。編輯前請參考原始問題。 – decPL

+1

「不,我的一個」K's「是一個類型,另一個是泛型​​類型參數。」我正是這個意思。你用K和V來做兩件不同的事情,這太可怕了。但是因爲編輯而刪除了-1。 –

-1

看來你需要的是這樣的:

class ClassK<T> { } 
class ClassV<T> { } 
class MyComplexDictionary<T> : Dictionary<K<T>, V<T>> { } 

它會阻止你在編譯的時候加上k <>和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 
+0

我已經在我的問題中涵蓋了'class MyComplexDictionary :Dictionary ,V > {}',它不起作用。它給出了語法錯誤。 – Kjara

+0

不知道爲什麼它給你一個語法錯誤,但我已通過在發佈我的答案之前在VS 2017中創建一個簡單的控制檯應用程序進行檢查。並沒有像預期的那樣出現問題。 – Koncervator