2016-06-21 84 views
-1

我今天遇到这个,我肯定有一个很好的理由,但为什么 是num2等于num1不一致的情况?长和int等于,等于什么()

long num1 = 1; 
int num2 = 1; 

num1.Equals(num2); // TRUE - cool. 
num2.Equals(num1); // FALSE - hmm? 
num2 == num1; // TRUE - ?! Whit? 

这是为什么。

+0

http://www.codeproject.com/Articles/584128/What-is-the-difference-between-equalsequals-and –

+2

@Daniel:不完全。这里的问题是关于隐含扩展转换的混淆。 – Joey

回答

7
num1.Equals(num2); 

解析到的long.Equals(long)过载,因为有一个隐含的扩大转换从intlong

num2.Equals(num1); 

调用int.Equals(object)这导致long NUM1被装箱。由于这不是int,所以比较返回false。

num2 == num1; 

调用重载==运营商long这又导致num2到在比较之前被提升到long

+0

绝对是,对于价值类型来说,它不仅具有相似的价值,而且类型也必须相同(或)应该被隐式转换。 – Rahul

+0

@Rahul它与它的值或引用类型无关。几乎所有(良好)相等的实现都被定义为只对相同类型的对象返回true。不这样做通常是执行“Equals”中的一个错误。 – Servy

0
long num1 = 1; 
int num2 = 1; 

MessageBox.Show(num1.Equals(num2).ToString()); 
MessageBox.Show(num2.Equals((int)num1).ToString()); 
MessageBox.Show((num2 == num1).ToString()); 

它的明确铸造只要一个int,使他们平等预期的问题。其他人正在为你铸造。

相关问题