请考虑以下代码:
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
我知道的;明确的事情
第二部分:当使用==
运算符与对象一起使用时,如果比较两个不同名称引用的内存中的一个对象(不太频繁,但可能会发生),则返回true。 Equals()
方法比较对象的内容(值)。在这个网站的许多答案中提到了这一点。
第一部分:使用==
运算符,编译器将“小”的类型转换为“大”的类型(例如:short
转换成 int
)并比较原始值。操作数的顺序(变量)无关紧要。最后一行的Equals()
的结果可能令人困惑,因为它返回false(不比较值),但是这是可以理解的。顺序很重要。正如在这个答案中所学到的那样,必须选择最佳的重载。它是由第一个变量的类型来选择的:short.Equals(short)
。但是,int
不能转换为“小”的类型(short
),因此没有进行比较,该方法返回false。
问题:
- 我上面的理解是正确的吗?
- 为什么第三部分的最后两行(使用
Equals()
)都返回false?与第一部分的第3行有什么不同?为什么不进行重载和值比较?这变得很抽象,我找不到原因。
int
。这不是同一个实例(Object.Equals 使用 Object.ReferenceEquals),所以 Equals 返回 false。当值类型被装箱时,会分配并构造一个新对象。 - Tim Schmelter(b.Equals(a));
会给你 false,而且没有装箱。 - BRAHIM Kamelobject.Equals
是虚方法,所以在OP的情况下将调用int.Equals
而不是object.Equals
。 - Evkb.Equals(a)
返回false
的原因是int16.Equals
如果类型不能隐式转换为short
,则调用Equals(Object)
。Int32
不是可隐式转换的类型,因此返回false
。如果你反转条件,你会得到true
,因为short
可以隐式转换为int
。阅读:https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/implicit-numeric-conversions-table - Tim Schmelter