c# – 当项目被强制转换为对象时,为什么equals不能正常工作?

当我转换int并浮动到object并比较它们时,相等性始终为false.为什么?
float f = 0.0f;
        int i = 0;
        Console.WriteLine(f.Equals(i)); // true
        Console.WriteLine(i.Equals(f)); // false
        Console.WriteLine(i == f); // true
        Console.WriteLine("----------------");
        object obf = f;
        object obi = i;
        Console.WriteLine(obf.Equals(obi)); // false
        Console.WriteLine(obi.Equals(obf)); // false
        Console.WriteLine(obi == obf); // false
        Console.WriteLine("----------------");

更新:
对于相同类型,情况并非如此

int i1 = 1;
        int i2 = 1;
        object oi1 = i1;
        object oi2 = i2;
        Console.WriteLine(oi1.Equals(oi2)); // true
        Console.WriteLine(oi2.Equals(oi1)); // true

解决方法

float只等于另一个float,而int只等于另一个int.返回true的唯一行是这些:
Console.WriteLine(f.Equals(i));
Console.WriteLine(i == f);

在这两种情况下,都将i的值隐式转换为float,因此它们等效于:

Console.WriteLine(f.Equals((float) i));
Console.WriteLine((float) i == f);

这些转换只是方法和运算符重载解析所需的正常转换.

其余的线都没有涉及隐式转换,因此它们比较两种不同的类型,即使按值进行比较(即所有Equals调用的情况),也会给出结果为false.这就是为什么在盒装int值上使用Equals会返回true,因为它比较了两个相同类型的值.

在这种情况下:

Console.WriteLine(obi == obf);

它甚至没有尝试比较数值 – 它正在比较盒装对象的引用.由于存在两个不同的引用,因此结果为false – 即使两个值都是int类型也是如此.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...