确切地说,班级中的哪些方法负责List<T>
的{{1}}运作?
我在班上超载了==。但它似乎没有效果。
答案 0 :(得分:11)
它只会调用Equals()
- 这就是所有需要被覆盖的(如果你对参考标识比较感到满意,则不会被覆盖)。如果类型实现IEquatable<T>
,则该实现将优先于普通Equals(object)
使用。
特别是,来自List<T>.Contains
的文档:
此方法使用确定相等性 默认的相等比较器
EqualityComparer(T).Default
T
,{。}} 列表中的值类型。
来自EqualityComparer<T>.Default
:
Default
属性检查是否 类型T
实现了System.IEquatable(T)
通用接口 如果是这样的话 使用它的EqualityComparer(T)
实现。否则它会返回 一个EqualityComparer(T)
使用 覆盖Object.Equals
和。{Object.GetHashCode
提供T
。
我认为它根本不会使用GetHashCode
。
答案 1 :(得分:2)
从.NET指南 - 如果实现==总是为object.Equals()和!=运算符提供实现。原因是运算符不是任何接口的一部分,并且在通用实现中不允许使用它们(List类不能在T上调用==运算符,因为不能保证T将定义运算符(例如参见结构) )。
答案 2 :(得分: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>();
}