c# – 当项目被强制转换为对象时,为什么equals不能正常工作?
发布时间:2020-12-15 18:32:13 所属栏目:百科 来源:网络整理
导读:当我转换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("------------
当我转换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类型也是如此. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- c# – 如果字符串存在于大型对象列表中,那么比较最快(性能)
- iphone – 如何禁用用户触摸UIbarbutton而不禁用?
- ruby-on-rails – Rails唯一性约束,并为null列匹配db唯一索
- Flex中的ArrayCollection绑定警告: unable to bind to prop
- vue微信分享 vue实现当前页面分享其他页面
- 为什么“rvm安装ruby-2.1.0”安装preview1?
- 使用pull解析xml
- 为何实体框架核心急于加载未包含的相关实体
- 邮箱/邮件地址的正则表达式及分析(JavaScript,email,rege
- ruby-on-rails – 实际上是什么Rails ActionController ::