1

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

我在课堂上重载了 ==。但它似乎没有任何效果。

4

3 回答 3

11

它只会调用Equals()- 这就是需要覆盖的所有内容(或者不,如果您对参考身份比较感到满意)。如果类型实现了IEquatable<T>,那么该实现将优先于一般使用Equals(object)

特别是,从文档中List<T>.Contains

此方法使用列表中值的类型的默认相等比较器确定相等性 EqualityComparer(T).DefaultT

EqualityComparer<T>.Default

Default属性检查 type 是否T实现了 System.IEquatable(T)泛型接口,如果是,则返回 EqualityComparer(T)使用该实现的一个。否则,它返回一个EqualityComparer(T)使用Object.EqualsObject.GetHashCode提供的覆盖的T

我不相信它会使用GetHashCode

于 2009-10-19T15:32:24.353 回答
2

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

于 2009-10-19T15:53:43.670 回答
1

它会调用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>();
}
于 2009-10-19T15:37:07.930 回答