当前位置:  开发笔记 > 编程语言 > 正文

Object.Equals的IL代码生成

如何解决《Object.Equals的IL代码生成》经验,为你挑选了1个好方法。

即使类型在运行时解析为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)重载.



1> Jakub Lortz..:

object.Equals方法是虚拟的,并被覆盖Int32.callvirt是一个多态调用 - 它将在调用虚方法之前检查对象的运行时类型,并使用正确的实现.

Int32实现IEquatable接口并定义另一个重载Equals

public bool Equals(Int32 obj);

只有在参数和调用它的值的编译时类型时,编译器才能选择此重载Int32.这里是编译时类型object,因此编译器只能使用object.Equals(object obj)重载.

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有