即使类型在运行时解析为Int32,IL也会将其显示为object.equals而不是int32.Equals,如下例所示:
object x = 5; object y = 5; Console.WriteLine(x.Equals(y));
但它返回True,这意味着它执行了值相等.我想我的问题不应该是IL本来应该的instance bool [mscorlib]System.Int32::Equals(int32)
// [18 13 - 18 27] IL_0001: ldc.i4.5 IL_0002: box [mscorlib]System.Int32 IL_0007: stloc.0 // x // [19 13 - 19 27] IL_0008: ldc.i4.5 IL_0009: box [mscorlib]System.Int32 IL_000e: stloc.1 // y // [21 13 - 21 46] IL_000f: ldloc.0 // x IL_0010: ldloc.1 // y IL_0011: callvirt instance bool [mscorlib]System.Object::Equals(object) IL_0016: call void [mscorlib]System.Console::WriteLine(bool) IL_001b: nop
Jakub Lortz.. 5
该object.Equals
方法是虚拟的,并被覆盖Int32
.callvirt
是一个多态调用 - 它将在调用虚方法之前检查对象的运行时类型,并使用正确的实现.
Int32
实现IEquatable
接口并定义另一个重载Equals
public bool Equals(Int32 obj);
只有在参数和调用它的值的编译时类型时,编译器才能选择此重载Int32
.这里是编译时类型object
,因此编译器只能使用object.Equals(object obj)
重载.
该object.Equals
方法是虚拟的,并被覆盖Int32
.callvirt
是一个多态调用 - 它将在调用虚方法之前检查对象的运行时类型,并使用正确的实现.
Int32
实现IEquatable
接口并定义另一个重载Equals
public bool Equals(Int32 obj);
只有在参数和调用它的值的编译时类型时,编译器才能选择此重载Int32
.这里是编译时类型object
,因此编译器只能使用object.Equals(object obj)
重载.