确切地说,类中的哪些方法负责List<T>
's Contains()
的操作?
我在课堂上重载了 ==。但它似乎没有任何效果。
它只会调用Equals()
- 这就是需要覆盖的所有内容(或者不,如果您对参考身份比较感到满意)。如果类型实现了IEquatable<T>
,那么该实现将优先于一般使用Equals(object)
。
特别是,从文档中List<T>.Contains
:
此方法使用列表中值的类型的默认相等比较器确定相等性
EqualityComparer(T).Default
。T
该
Default
属性检查 type 是否T
实现了System.IEquatable(T)
泛型接口,如果是,则返回EqualityComparer(T)
使用该实现的一个。否则,它返回一个EqualityComparer(T)
使用Object.Equals
和Object.GetHashCode
提供的覆盖的T
。
我不相信它会使用GetHashCode
。
根据 .NET 指南 - 如果您实现 == 始终提供 object.Equals() 和 != 运算符的实现。原因是运算符不是任何接口的一部分,并且在泛型实现中不允许使用它们(List 类不能在 T 上调用 == 运算符,因为不能保证 T 将定义运算符(参见结构示例) )。
它会调用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>();
}