我有一个返回Dictionary的泛型函数。如果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)
像这样投射:
aDict = stringDict as Dictionary<K, V>;
答案 1 :(得分: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
答案 2 :(得分:1)
一种常见的解决方案 - 通过中级演员投射到object
:
aDict = (Dictionary<K,V>)(object)stringDict;