【问题标题】:C# comparing int and long as object [duplicate]C#比较int和long作为对象[重复]
【发布时间】: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


【解决方案1】:

这是因为您将变量隐式装箱到堆中,这会创建新的引用,这就是为什么 equals2false

【讨论】:

  • 您可以使用Equals(object1, object2) 来防范null,但这并不能解决问题,see here
  • @canton7 没错,这就是== 正在做的事情,但是使用单个 arg 版本会强制它使用子类型实现。
  • 我不关注 -- Equals(object a, object b) 在空检查后委托给 a.Equals(b)see here。如果您在两个整数类型之间使用==,这并不能解决Int32.Equals(object) 不会尝试执行编译器将执行的内置数字转换的问题
  • object1.Equals(object2) 没有解决我的问题。 link
猜你喜欢
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
  • 2020-10-15
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
相关资源
最近更新 更多