我有一个通用类
public class Mapper<K, L, V> : Dictionary<K, V>
当我将其实例化为
时Mapper<string, string, MapSource> Map= new Mapper<string, string, MapSource>();
然后尝试做
Map["..."].
带有
的编译器错误消息以下方法或属性之间的调用不明确:'MinorTesting.XML.Sourcer.Mapper.this [L]'和'MinorTesting.XML.Sourcer.Mapper.this [K]'
如何修复此问题以删除编译。
鲍勃。
答案 0 :(得分:5)
所以你的班级看起来像这样:
public class MultiKeyDictionary<K, L, V>
{
public V this[K key]
{
get { return... }
}
public V this[L key]
{
get { return... }
}
}
因此,如果您构建的类型中K
和L
都是string
,那么您基本上就是这样:
public class MultiKeyDictionary
{
public V this[string key]
{
get { return... }
}
public V this[string key]
{
get { return... }
}
}
显然这不起作用。问题在于此处使用特定的泛型方法 - 您可以通过将Item属性替换为以下内容来安全地支持两个相同类型的键:
public V GetByK(K key)
{
...
}
public V GetByL(L key)
{
...
}
答案 1 :(得分:4)
MultiKeyDictionary
的外观和使用位置/方式是什么?
看起来MultiKeyDictionary
提供了两个索引器,this[L]
和this[K]
。当L
和K
相同时,编译器无法在这些索引器之间进行选择,因为它们实际上都变为this[string]
。
在这种情况下,一种选择是提供明确的方法来代替索引器:例如,GetByKey(K)
和GetByValue(L)
或类似的。
答案 2 :(得分:0)
您的班级继承自Dictionary<K, V>
,其中隐式定义您班级的this[K]
访问者。当您明确定义this[L]
访问者,并且K
和V
重合时,就会发生冲突。
在我看来,你不应该继承Dictionary
。您可能希望封装字典以供内部使用。
答案 3 :(得分:0)
可能就是这样。
public class Mapper<K, L, V> : Dictionary<K, V>
{
public V this[K key1, L Key2]
{
get { return (key1 != null) ? dic[key1] : dic[Key2]; }
}
}
要访问此
Mapper<string, string, int> a = new Mapper<string, string, int>();
var s = a[null, "sam"];