В этом примере третий результат возвращает false, все хорошо, но четвертый пример возвращает true.
Я не совсем понимаю, как это работает, по умолчанию Object.Equals
сравнивает две ссылки для объекта равенство и видя, как a
и b
оба указывают на уникальный экземпляр строки, это должно возвращать значение 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
}
Правильно, поэтому, даже если мы передадим строку объекту, она все равно вызовет переопределенную реализацию '.Equals'? –
@OverlyExcessive yes; это ключевой момент полиморфизма; акцент: такие операторы, как '==', являются ** не ** полиморфными –