【发布时间】:2018-03-31 11:00:01
【问题描述】:
考虑这段代码:
int a = 0;
short b = 0;
int c = 0;
object a1 = a;
object b1 = b;
object c1 = c;
Console.WriteLine(1);
//comparing primitives - int vs. short
Console.WriteLine(a == b);
Console.WriteLine(b == a);
Console.WriteLine(a.Equals(b));
Console.WriteLine(b.Equals(a));
Console.WriteLine(2);
//comparing objects - int vs. int
Console.WriteLine(c1 == a1);
Console.WriteLine(a1 == c1);
Console.WriteLine(c1.Equals(a1));
Console.WriteLine(a1.Equals(c1));
Console.WriteLine(3);
//comparing objects - int vs. short
Console.WriteLine(a1 == b1);
Console.WriteLine(b1 == a1);
Console.WriteLine(a1.Equals(b1)); //???
Console.WriteLine(b1.Equals(a1));
它打印这个输出:
1
True
True
True
False
2
False
False
True
True
3
False
False
False
False
我知道的;什么是明确的
第 2 节:== 运算符仅在比较内存中由两个不同名称引用的一个对象时才会返回 true(不是很常见,但可能会发生)。 Equals() 方法比较对象的内容(值)。 这个网站的很多答案都提到了。
第 1 节:使用 == 运算符,编译器将“较小”类型转换为“较大”(short 到 int)并比较原始值。操作数(变量)的顺序无关紧要。最后一行中Equals() 的结果可能会令人困惑,因为它返回 false(不比较值),但可以理解。这里的顺序很重要。正如在此answer 中所了解的,必须选择最佳过载。它由第一个变量的类型选择:short.Equals(short)。但是int 无法转换为“较小”类型(short),因此没有进行比较并且方法返回 false。
问题:
- 我上面的理解正确吗?
- 为什么第 3 节的最后两行(使用
Equals())都返回 false?为什么第 1 节第 3 行有区别?为什么不进行重载和值比较?它变得非常抽象,我找不到原因。
【问题讨论】:
-
它们返回 false 因为您在
Object中有 boxed 值类型int。这不是同一个实例(Object.Equals使用Object.ReferenceEquals)所以Equals返回 false。当一个值类型被装箱时,一个新的对象被分配和构造。 -
@TimSchmelter 注意
(b.Equals(a));会给你假,没有装箱 -
@BRAHIMKamel:我已经回答了 OP 的第二个问题
-
@TimSchmelter 我认为这不是真的,因为
object.Equals是虚拟方法,所以在OP 情况下int.Equals将被调用,而不是object.Equals。 -
@BRAHIMKamel:
b.Equals(a)返回false的原因是,如果类型不能隐式转换为short,int16.Equals会调用Equals(Object)。Int32不是,所以它返回 false。如果您反转条件,您会得到true,因为short隐式转换为int。阅读:docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
标签: c# comparison equals