无论类型如何,比较两个整数对象的相等性
我想知道如何比较两个盒装整数(可以是有符号或无符号)以保证相等。
例如,看看这个场景:
// 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)
我对如何以这种方式可靠地比较盒装整数类型感到困惑。 直到运行时我才会知道它们是什么,我不能把它们都放到long
,因为一个可能是一个ulong
。 我也不能将它们都转换为ulong
因为一个可能是负面的。
我能提出的最好的想法就是试错,直到我能找到一个共同的类型,或者可以排除它们不相等,这不是一个理想的解决方案。
在第2种情况下,实际上最终调用了int.Equals(int)
,因为ushort
可以隐式转换为int
。 此重载解析在编译时执行。 它在案例3中不可用,因为编译器只知道int5
和int6
的类型作为object
,因此它调用int6
object.Equals(object)
…并且如果两个对象的类型是object
,则int6
将返回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);
这将处理比较ulong
和long
。
我选择了decimal
因为它可以精确地表示每个原始整数类型的每个值。
整数是一种值类型。 比较两个整数类型时,compiller会检查它们的值 。
对象是引用类型。 比较两个对象时,compiller会检查它们的引用 。
有趣的部分在这里:
object int5 = (int)50505;
Compiller执行装箱操作,将值类型包装到引用类型中, Equals
将比较引用,而不是值。