繁体   English   中英

无论类型如何,比较两个整数对象的相等性

[英]Compare two integer objects for equality regardless of type

我想知道如何比较两个盒装整数(可以是有符号或无符号)以保证相等。

例如,看看这个场景:

// case #1
object int1 = (int)50505;
object int2 = (int)50505;
bool success12 = int1.Equals(int2); // this is true. (pass)

// case #2
int int3 = (int)50505;
ushort int4 = (ushort)50505;
bool success34 = int3.Equals(int4); // this is also true. (pass)

// case #3
object int5 = (int)50505;
object int6 = (ushort)50505;
bool success56 = int5.Equals(int6); // this is false. (fail)

我很难理解如何以这种方式可靠地比较盒装整数类型。 直到运行时我才会知道它们是什么,而且我不能把它们都扔ulong long ,因为一个可能是一个ulong 我也不能将它们都转换为ulong因为一个可能是负面的。

我能想到的最好的想法就是试错,直到找到一个普通类型或者可以排除它们不相等,这不是一个理想的解决方案。

在第2种情况下,实际上最终调用了int.Equals(int) ,因为ushort可以隐式转换为int 此重载解析在编译时执行。 这不是在情况下3个可用,因为编译器只知道的类型int5int6作为object ,所以它调用object.Equals(object) ......,它是自然object.Equals将返回false ,如果类型的两个对象是不同。

可以使用动态类型在执行时执行相同类型的重载解析 - 但如果您尝试过以下操作,则仍然会遇到问题:

dynamic x = 10;
dynamic y = (long) 10;
Console.WriteLine(x.Equals(y)); // False

这里没有处理long重载,所以它会调用普通的object.Equals

一种选择是将值转换为decimal

object x = (int) 10;
object y = (long) 10;
decimal xd = Convert.ToDecimal(x);
decimal yd = Convert.ToDecimal(y);
Console.WriteLine(xd == yd);

这将处理比较ulonglong

我选择了decimal因为它可以精确地表示每个原始整数类型的每个值。

整数是一种类型。 比较两个整数类型时,compiller会检查它们的

对象是引用类型。 比较两个对象时,compiller会检查它们的引用

有趣的部分在这里:

 object int5 = (int)50505; 

Compiller执行装箱操作,将值类型包装到引用类型中, Equals将比较引用,而不是值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM