IList products = new ArrayList(); 那么将只有重写 Equals 这个方法才有效了。处理对象判等有很多方法,但不同的集合类可能会采用不同的方法。 回复 更多评论 # re: 当调用 Remove 失效时 [C#] 2007-01-07 00:12 木野狐 @Allen Lee 刚才我用 Reflector 追溯了一下 List<T> 类的判等方法,最终追溯到了 System.Collections.Generic.EqualityComparer<T> 是这个类负责判定对象是否相等。而他有几个子类如下: ByteEqualityComparer, GenericEqualityComparer<T>, NullableEqualityComparer<T>, ObjectEqualityComparer<T> 上面你提到的如果实现 IEquatable<T> 接口,那么最终会调用到 GenericEqualityComparer<T>, 其判等代码如下: public override bool Equals(T x, T y) { if (x != null) { if (y != null) { return x.Equals(y); } return false; } if (y != null) { return false; } return true; } 我们可以看到,追根溯源,最终都要调用到 System.Object.Equals 方法的,而这个方法的默认实现就是和 GetHashCode 直接相关。 如果看一下其他几个判等器(ByteEqualityComparer, NullableEqualityComparer<T>, ObjectEqualityComparer<T>),会发现情况没有什么不同。 根据这个分析可以知道,实际上判等和集合类是没有什么联系的,只是集合元素类型自身的比较。并且根据 .NET 的设计规范,Equals 和 == 的语意也应该是一致的。重写 Equals 语意的同时必然也应该重写运算符 ==. http://www.cnblogs.com/allenlooplee/archive/2007/01/06/613608.html |