2015-09-14 28 views
0

我有一個泛型函數返回一個字典。如果Dictionary的鍵是一個字符串,我想使用String.OrdinalIgnoreCase比較器。返回通用字典取決於類型

這是我的代碼:

public static Dictionary<K,V> getDict<K,V>() 
    { 
     Dictionary<K,V> aDict; 

     if(typeof(K)==typeof(string)) 
     { 
      var stringDict = new Dictionary<string, V>(StringComparer.OrdinalIgnoreCase); 
      aDict = (Dictionary<K,V>)stringDict; // error here - can't convert. 
     } 
     else aDict = new Dictionary<K, V>(); 
// do more stuff here 
     return aDict; 
    } 

但是它告訴我它

不能轉換Dictionary<string,V>Dictionary<K,V>

我應該怎麼做?

+0

不要讓你的泛型方法依賴於類型參數? –

回答

2

這應該工作最適合你的:

var stringDict = new Dictionary<K, V>(
    StringComparer.OrdinalIgnoreCase as IEqualityComparer<K>); 

問題是Dictionary<TKey,TValue> ctor期望IEqualityComparer<T>StringComparer爲您提供IEqualityComparer - 非通用品種。一旦你正確地投入你的等號比較器,你應該在你的路上。下面

測試代碼塊將引發預期的異常:

var dict = getDict<string, int>(); 

dict.Add("alpha", 1); 
dict.Add("Alpha", 2); // triggers the expected duplicate key exception. 

HTH ...

1

一個共同的解決方案 - 通過中間鑄轉換爲object

aDict = (Dictionary<K,V>)(object)stringDict;  
2

演員是這樣的:

aDict = stringDict as Dictionary<K, V>; 
+0

爲什麼不能簡單地返回null當演員失敗? –

+0

那麼,如果我們在這裏,我們用if語句檢查K是字符串。這就是爲什麼我們可以確定演員陣容不會失敗。 –

+0

啊。謝謝。我認爲,如果演員陣容失效,那麼失敗將會失敗,因爲它有效地試圖控制演員陣容 –