当我比较一个Object(类型)它是否使用特定类的IEquatable?
我的方法接收两个参数,均为
Object
类型。它们具有相同的类型,实现IEquatable
。
我的问题是:当我这样做时:param1 == param2
框架是否使用特定类的IEquatable
运算符覆盖进行比较,还是使用仅仅比较两个对象的内存指针的object.Equals
?
这是最好的方法吗?是否有泛型和派生约束?
没有找到相关结果
已邀请:
3 个回复
梆晨灸碾
运算符将测试引用相等性,而不管
方法的被覆盖行为(如果你已经覆盖它,如果你实现了
,你当然应该拥有它)。 也就是说,如果您的变量输入为
但是您想使用自己的自定义相等比较,请使用
而不是
。 然后,即使你已经实现了
,一定要覆盖
,如下所示:
虽然您当然也可以为您的类型重载
和
运算符,但如果您引用此类型的对象只是
变量,则无法完成任何操作,如下所示:
上面的方法不会像你预期的那样工作(如果你已经超载
并期望使用它),因为
重载必须在编译时解决;因为
和
被输入为任意对象,所以C#编译器将选择
类型的
运算符,再次只测试引用相等性。 更新:现在,如果您的变量被键入为您定义的类或更多派生类型,则可以确保使用
运算符。例如,给定以下类型:
上面的
方法将使用你的重载
运算符来源于
的任何类型
。 要记住的关键是
是静态的,这意味着它的重载分辨率是在编译时执行的,而不是在运行时使用vtable执行(除非你使用的是
,但那是另一个野兽)。因此,只要您在代码中使用
运算符并且希望重载解析为自定义类型的运算符时,请注意这一点。
靛新比比催
僻朵庙惩竣
那么做
只执行引用相等,因为
运算符不是多态的。