如何识别泛型类中的匹配类型

时间:2010-12-01 14:37:14

标签: c# generics

我有一个通用类

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]'

如何修复此问题以删除编译。

鲍勃。

4 个答案:

答案 0 :(得分:5)

所以你的班级看起来像这样:

public class MultiKeyDictionary<K, L, V>
{
    public V this[K key]
    {
        get { return... }
    }

    public V this[L key]
    {
        get { return... }
    }
}

因此,如果您构建的类型中KL都是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]。当LK相同时,编译器无法在这些索引器之间进行选择,因为它们实际上都变为this[string]

在这种情况下,一种选择是提供明确的方法来代替索引器:例如,GetByKey(K)GetByValue(L)或类似的。

答案 2 :(得分:0)

您的班级继承自Dictionary<K, V>,其中隐式定义您班级的this[K]访问者。当您明确定义this[L]访问者,并且KV重合时,就会发生冲突。

在我看来,你不应该继承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"];