代码之家  ›  专栏  ›  技术社区  ›  user366312

contains()list方法<t>

  •  1
  • user366312  · 技术社区  · 15 年前

    准确地说,类中的哪些方法负责 List<T> Contains() 操作?

    我在班上超载了。但似乎没有效果。

    3 回复  |  直到 13 年前
        1
  •  11
  •   Jon Skeet    15 年前

    它只会打电话 Equals() -这就是所有需要重写的内容(如果您对引用标识比较满意的话,也可以不重写)。如果类型实现 IEquatable<T> 然后将优先使用该实现 Equals(object) 不过。

    尤其是从文件中 List<T>.Contains :

    此方法使用 默认的相等比较器 EqualityComparer(T).Default 对于 T , the 列表中的值类型。

    EqualityComparer<T>.Default :

    这个 Default 属性检查是否 类型 T 实现 System.IEquatable(T) 通用接口 如果是这样,返回 EqualityComparer(T) 使用那个 实施。否则它会返回 安 均等比较器(T) 使用 重写 Object.Equals Object.GetHashCode 提供的 T .

    我不相信它能用 GetHashCode 尽管如此。

        2
  •  2
  •   Adrian Zanescu    15 年前

    从.NET指南-如果实现==始终为object.equals()和提供实现!=算符。原因是运算符不是任何接口的一部分,并且不允许在泛型实现中使用它们(列表类不能在t上调用==运算符,因为不能保证t将定义运算符(例如,请参见结构))。

        3
  •  1
  •   Anton Gogolev    15 年前

    它要么打电话 Object.Equals() 或者,如果你已经实现了, IEquatable<T>.Equals() 以下内容:

    private static EqualityComparer<T> CreateComparer()
    {
        Type c = typeof(T);
        if (c == typeof(byte))
        {
            return (EqualityComparer<T>) new ByteEqualityComparer();
        }
        if (typeof(IEquatable<T>).IsAssignableFrom(c))
        {
            return (EqualityComparer<T>) typeof(GenericEqualityComparer<int>).TypeHandle.CreateInstanceForAnotherGenericParameter(c);
        }
        if (c.IsGenericType && (c.GetGenericTypeDefinition() == typeof(Nullable<>)))
        {
            Type type2 = c.GetGenericArguments()[0];
            if (typeof(IEquatable<>).MakeGenericType(new Type[] { type2 }).IsAssignableFrom(type2))
            {
                return (EqualityComparer<T>) typeof(NullableEqualityComparer<int>).TypeHandle.CreateInstanceForAnotherGenericParameter(type2);
            }
        }
        return new ObjectEqualityComparer<T>();
    }