Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# net字典有什么问题?_C#_.net_Dictionary - Fatal编程技术网

C# net字典有什么问题?

C# net字典有什么问题?,c#,.net,dictionary,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;

不言而喻:

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];
    }
}

这段代码和我选择的任何特定类型的代码都编译得很好。。。我震惊了…

这里的问题是您已经定义了两次
T
。您已经将类和方法都设置为泛型,并为它们提供了一个具有相同名称的泛型参数

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

参数
value
在方法的泛型参数在作用域中的位置声明,并且由于该方法的
T
比在类级别声明的
T
更“接近”,因此在尝试解析该变量的类型时,它“获胜”

现在有了一个
T
类型的参数和一个
Dicitonary
,但是该参数的类型仍然不同于字典的泛型参数

要弄清楚这一点,最简单的方法是转到泛型参数,并使用visual studio的“重命名”功能重命名类型(仅为
T2
或其他类型),然后您将看到哪些
T
发生了更改,哪些没有更改。执行此操作后,错误消息也会有意义,因为这些不同类型的错误消息在错误消息中的显示方式实际上是不同的


至于修复,只需使该方法不是泛型的。

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

删除方法上的类型约束应该可以解决以下问题:

public T GetValue(T value)

您得到的确切编译错误是什么?您所说的编译代码充满了多个编译器错误……作为补充说明,每当您认为C#语言或某个.NET类中存在错误时,您几乎可以确定该错误与您的使用有关。它成为有bug的语言或基本库的可能性很小。
public T GetValue(T value)