我有一个比较2个通用对象的方法(它需要保留对象,因为这个方法必须是通用的)。当我用==或.Equals比较对象时,我得到一个假。但是当我在当时输入对象到我已知的类型时,我得到了真实。我唯一的解释是它是比较引用或指针,它们不相同,但对象是。
private static bool AreSame(object a, object b)
{
bool equalsResult = a.Equals(b);
bool compareResult = a == b;
bool castingResult = (a as MyClass).Equals(b as MyClass);
}
如果不知道预编译我将要比较的类或对象,我该如何解决这个问题呢?
答案 0 :(得分:2)
只有在Equals
重载的行为与从Equals(object)
继承的Object
方法不同的情况下才会发生此行为,例如
public class MyClass
{
public bool Equals(MyClass c) { ... }
}
在这种情况下,您应该实施IEquatable<MyClass>
并覆盖Object.Equals
以使用它:
public class MyClass : IEquatable<MyClass>
{
public bool Equals(MyClass c) { ... }
public override bool Equals(object o)
{
var c = o as MyClass;
return c != null && Equals(c);
}
}
然后您可以使用现有方法或通用方法:
private static bool AreSame<T>(T a, T b) where T : IEquatable<T>
{
return EqualityComparer<T>.Default.Equals(a, b);
}