Ove*_*ive 8 c# polymorphism equality unary-operator
在下面的示例中,第三个评估返回false,一切都很好,但第四个示例返回true ..
我不太明白这是如何工作的,但默认情况下Object.Equals比较两个引用以实现对象相等,并且看到as a和bboth都指向一个唯一的一个字符串的实例,这应该返回false,它在第三个例子中但不在第四个例子中.
现在我理解为什么它在第二个例子中返回true,因为.Equals()在字符串类中重写了方法,但在第四个例子中,我们将此字符串作为对象进行转换.
所以不会Object.Equals在这种情况下打电话吗?
static void Main()
{
// Create two equal but distinct strings
string a = new string(new char[] {'h', 'e', 'l', 'l', 'o'});
string b = new string(new char[] {'h', 'e', 'l', 'l', 'o'});
Console.WriteLine (a == b); // Returns true
Console.WriteLine (a.Equals(b)); // Returns true
// Now let's see what happens with the same tests but
// with variables of type object
object c = a;
object d = b;
Console.WriteLine (c == d); // Returns false
Console.WriteLine (c.Equals(d)); // Returns true
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 10
线索是"默认情况下".string覆盖object.Equals自定义实现.由于object.Equals是一个多态方法(virtual/ overrideetc),即使变量(/ expression)类型是,也会使用派生最多的实现object.
==但是,不是多态的; 使用的实现完全取决于变量(/ expression)类型.在这种情况下,由于已知类型object,唯一可用的比较是参考相等.
也许更简洁:
class Foo {
public override string ToString() { return "hi"; }
}
//...
object obj = new Foo();
string s = obj.ToString(); // this is "hi"
Run Code Online (Sandbox Code Playgroud)
这是相同的原则:无论编译器知道哪种类型(object在本例中),都使用虚拟方法的派生最多重载.