这与类和Equals(object o)(覆盖operator ==)方法有关。字符定义如下:
public class char : object
{
private uint value;
//some more implementation
override bool Equals(object o)
{
//code simplified - no try-catches etc.
return this.value.Equals((uint) o);
}
}
现在,当您尝试比较 object 类型的对象时,它们没有覆盖此 Equals 方法并使用默认方法。由于对象是默认引用类型,它们试图比较引用。
更多详情请关注MSDN。
另外MSDN - Class and struct differences会给你一些更多的信息。
你的代码是做什么的?
它从一侧取“a”,从另一侧取“a”。它将创建每个(对象)的新实例,例如:
char obj1 = 'a';
char obj2 = 'a';
如果您将它们作为字符进行比较,您将获得真正的价值:
obj1.Equals(obj2); //true
但是如果你把它们扔给对象,Equals 的内部实现将检查内存(PC 的物理内存)并查看 obj1 的实例在哪里以及 obj2 的实例在哪里。如果他们没有在同一个位置找到两者(相同的内存地址 - 内存中的相同单元格,它将返回 false)
((object)obj1).Equals(obj2); // false
((object)obj1).Equals((object)obj2); // false
(obj1).Equals((object)obj2); // false
这可以通过在调用 Equals 方法之前强制转换变量来避免。
((char)(object)obj1).Equals(obj2); // true
((char)(object)obj1).Equals((char)(object)obj2); // true
(obj1).Equals((char)(object)obj2); // true
它如何与引用相等一起工作?
public class MyClass
{
public char Val { get; set; }
}
MyClass obj1 = new MyClass() { Val = 'a' };
MyClass obj2 = obj1;
obj1.Equals(obj2); // true
**注意:** 我没有像@Sweeper 那样使用术语“拳击”。
装箱意味着对象被转换为不同的对象,并获得与作为其他对象处理相关的不同行为。 (它与 OOP 术语多态性密切相关)。