.net字典有什么问题?

时间:2015-04-02 15:13:15

标签: c# .net dictionary

没有任何言语:

public class MemoryDictionary<T>
{
    private Dictionary<T, T> items = new Dictionary<T, T>();
    public T GetValue<T>(T value)
    {
        if (!items.ContainsKey(value))
        {
            items[value] = value;

        }
        return items[value];
    }
}

这里有什么问题,为什么不编译?我的意思是,它实际上说ContainsKey方法有一个无效的参数,但是......它是愚蠢的!论证是正确的!

奇怪的是:

public class MemoryDictionary<string>
{
    private Dictionary<string, string> items = new Dictionary<string,string>();
    public string GetValue<string>(string value)
    {
        if (!items.ContainsKey(value))
        {
            items[value] = value;

        }
        return items[value];
    }
}

这段代码和我选择某种特定类型的代码编译得很好......我震惊了......

2 个答案:

答案 0 :(得分:7)

这里的问题是你已经定义了T两次。您已经使类和方法都是通用的,并且给它们两个具有相同名称的通用参数。

您的字段是在方法之外定义的,因此该上下文中的T仅引用声明为类的通用参数的T

参数value在方法的泛型参数在范围内的位置声明,并且由于该方法的T比在类级别声明的T“更近”,在尝试解析该变量的类型时,它“胜出”。

所以现在你有一个T类型的参数和一个Dicitonary<T, T>,但该参数的类型仍然不同于字典的通用参数

明确这一点的简单方法是使用通用参数并使用visual studio的“重命名”功能重命名类型(仅T2或其他),然后您将看到{{1改变,哪些不改变。执行此操作后,错误消息也将有意义,因为这些不同的类型实际上将在错误消息中以不同方式显示。

至于修复,只是让方法不通用。

答案 1 :(得分:3)

您在类中的泛型类型约束与GetValue()方法之间存在命名冲突。

删除方法的类型约束应解决问题:

public T GetValue(T value)