当我比较一个Object(类型)它是否使用特定类的IEquatable?

我的方法接收两个参数,均为
Object
类型。它们具有相同的类型,实现
IEquatable
。 我的问题是:当我这样做时:
param1 == param2
框架是否使用特定类的
IEquatable
运算符覆盖进行比较,还是使用仅仅比较两个对象的内存指针的
object.Equals
? 这是最好的方法吗?是否有泛型和派生约束?     
已邀请:
实际上,它既没有。默认情况下,
==
运算符将测试引用相等性,而不管
Equals
方法的被覆盖行为(如果你已经覆盖它,如果你实现了
IEquatable<T>
,你当然应该拥有它)。 也就是说,如果您的变量输入为
object
但是您想使用自己的自定义相等比较,请使用
Equals(x, y)
而不是
x == y
。 然后,即使你已经实现了
IEquatable<T>
,一定要覆盖
object.Equals
,如下所示:
class MyType : IEquatable<MyType>
{
    public bool Equals(MyType other)
    {
        // Whatever you want.
    }

    public override bool Equals(object other)
    {
        // Presumably you check for null above.
        return Equals(other as MyType);
    }
}
虽然您当然也可以为您的类型重载
==
!=
运算符,但如果您引用此类型的对象只是
object
变量,则无法完成任何操作,如下所示:
object x = new MyType();
object y = new MyType();
Console.WriteLine(Equals(x, y));
Console.WriteLine(x == y);
上面的方法不会像你预期的那样工作(如果你已经超载
==
并期望使用它),因为
==
重载必须在编译时解决;因为
x
y
被输入为任意对象,所以C#编译器将选择
object
类型的
==
运算符,再次只测试引用相等性。 更新:现在,如果您的变量被键入为您定义的类或更多派生类型,则可以确保使用
==
运算符。例如,给定以下类型:
class A
{
    public static bool operator ==(A x, A y) { return true; }
    public static bool operator !=(A x, A b) { return false; }
}

class B : A { }

class AComparer<T> where T : A
{
    public bool CompareEqual(T x, T y) { return x == y; }
}
上面的
AComparer<T>.CompareEqual
方法将使用你的重载
==
运算符来源于
A
的任何类型
T
。 要记住的关键是
==
是静态的,这意味着它的重载分辨率是在编译时执行的,而不是在运行时使用vtable执行(除非你使用的是
dynamic
,但那是另一个野兽)。因此,只要您在代码中使用
==
运算符并且希望重载解析为自定义类型的运算符时,请注意这一点。     
你也必须重写Equals,甚至GetHashCode():看看这里: http://blogs.msdn.com/b/jaredpar/archive/2009/01/15/if-you-implement-iequatable-t-you-still-must-override-object-s-equals-and-gethashcode。 ASPX     
如果你的方法的参数被指定为
object
那么做
param1 == param2
只执行引用相等,因为
==
运算符不是多态的。     

要回复问题请先登录注册