【发布时间】:2022-01-04 16:27:49
【问题描述】:
如果比较“object”类型的 2 个变量,即 Int32 和 Int64,则在 Visual Studio 中显示“true”。 如果我将它保存在一个变量中,它会突然变为“false”。 我已经尝试过 EqualityComparer。值保持不变。
int number1 = 2;
long number2 = 2;
object object1 = number1;
object object2 = number2;
var equals1 = number1 == number2; // true
var equals2 = object1 == object2; // object1 == object2 is true, equals2 is false
这是为什么呢?
编辑:
【问题讨论】:
-
简单地说,没有简单的方法可以解决这个问题。当您执行
int == long时,编译器 会发现存在从 int 到 long 的转换,并插入代码来执行此操作。当双方都是object时,编译器不能这样做。运行时中没有任何东西可以接受整数类型并确定它们是否都可以转换为通用类型。如果您知道其中一个数字是 int 而另一个是 long,您可以自己进行此转换:Convert.ToInt64(object1) == Convert.ToInt64(object2) -
我不同意 dup,因为“我已经尝试过 EqualityCompare”这句话——
EqualityComparer已经按照 dup 中的答案所说的那样做做,但这不起作用,因为 OP 使用两种装箱的整数类型,它们不一定是相同的类型。投票重新开放。 -
"Hardcast to Int32 / Int64 很遗憾,这不是一种选择。" -- 你能解释一下为什么不可以吗?了解这一点将有助于我们提出合适的解决方法
-
@canton7 我更新了关于 EqualityComparer 的截图。令我困惑的是,如果检查 object1 和 object2 是否相等,Visual Studio 在调试时实际上显示为 true。我真的不想要硬播,因为我不想检查所有不同的类型组合。但是,如果对此没有优雅的解决方案,我将不得不考虑这一点。
-
@Servy,同样,这个问题并没有解决装箱整数是不同类型的问题。那是关于
<boxed int> == <boxed int>,而不是<boxed int> == <boxed long>
标签: c# .net object equals equals-operator