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

cae*_*say 29 .net c# math boxing

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

例如,看看这个场景:

// 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)
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*eet 36

在案例2中,您实际上最终会调用int.Equals(int),因为ushort可以隐式转换为int.此重载解析在编译时执行.它在案例3中不可用,因为编译器只知道类型int5int6as object,因此它调用object.Equals(object)... 如果两个对象的类型不同,它将自然object.Equals返回false.

可以使用动态类型在执行时执行相同类型的重载决策 - 但是如果你尝试过类似的东西,你仍然会遇到问题:

dynamic x = 10;
dynamic y = (long) 10;
Console.WriteLine(x.Equals(y)); // False
Run Code Online (Sandbox Code Playgroud)

这里没有可以处理的重载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);
Run Code Online (Sandbox Code Playgroud)

这将处理比较ulonglong为好.

我之所以选择,decimal因为它可以准确地表示每个原始整数类型的每个值.