【问题标题】:What is wrong with .net dictionary?.net 字典有什么问题?
【发布时间】:2015-04-02 15:13:14
【问题描述】:

无话可说:

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

这段代码和我选择某些特定类型的任何代码都编译得很好......我惊呆了......

【问题讨论】:

  • 您得到的确切编译错误是什么?
  • 你说的编译出来的代码里面充满了多个编译器错误……
  • 附带说明,只要您认为 C# 语言或某个 .NET 类中存在错误,您几乎可以确定该错误与您对它的使用有关。它是有 bug 的语言或基础库的可能性很小。

标签: c# .net dictionary


【解决方案1】:

这里的问题是您已经定义了两次T。您已将类和方法设为通用,并为它们提供了同名的通用参数。

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

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

所以现在你有一个TDicitonary&lt;T, T&gt; 类型的参数,但是该参数的类型仍然不同于字典的通用参数

明确这一点的简单方法是转到通用参数并使用 Visual Studio 的“重命名”功能来重命名类型(只是 T2 或其他东西),你会看到哪个 T改变,哪些不改变。执行此操作后,错误消息也将有意义,因为这些不同的类型实际上会在错误消息中以不同的方式显示。

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

【讨论】:

    【解决方案2】:

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

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

    public T GetValue(T value)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 2011-02-14
      相关资源
      最近更新 更多