键入字典的自定义相等比较器

vex*_*exe 2 c# dictionary iequalitycomparer

既然Int32 是a Object,我想要打印"True"

    Dictionary<Type, string> dict = new Dictionary<Type, string>(new MyComparer());
    dict[typeof(object)] = "Hello";

    Console.WriteLine(dict.ContainsKey(typeof(int))); // currently prints false :(
Run Code Online (Sandbox Code Playgroud)

这是我试过的比较器:

    public class MyComparer : IEqualityComparer<Type>
    {
        public bool Equals(Type x, Type y)
        {
            return y.IsAssignableFrom(x);
        }

        public int GetHashCode(Type obj)
        {
            return obj.GetHashCode();
        }
    }
Run Code Online (Sandbox Code Playgroud)

但它不起作用.我不太清楚要返回什么GetHashCode- 我知道这是错误的原因,当调试我甚至没有达到Equals- 任何想法如何写这个正确?谢谢.

Mar*_*ell 6

这根本不是字典的有效比较器,结果没有明确定义.平等比较应该是可交换的,特别是a eq b 当且仅当 b eq a.这不适用于您的情况.同样,有效的哈希代码实现声明:

  • 如果两个哈希值不相等,则两个值不相等
  • 两个相等的值必须具有相同的哈希码

那也失败了.

基本上,这是行不通的.

具体来说,来自MSDN:

对实施者的说明

需要实现以确保如果Equals方法对于两个对象x和y 返回true,则x的GetHashCode方法返回的值必须等于为y返回的值.

Equals方法是自反,对称和传递的.也就是说,如果用于将对象与自身进行比较,则返回true ; 两个对象的x和y,如果它是真实为y和x; 和真正的两个对象x和z,如果它是真实的 x和y,并真正为y和z.