title: Why is Object.Equals preferred to calling String.Equals from an instance?
body: <p>I am preparing for certification on C# and face the following question (code edited for simplicity):</p>
  
  <pre><code>class Class
  {
      public string Name { get; set; } = "hello";
  }
  
  ...
  
  Class a = new Class();
  Class b = new Class();
  Class c = a;
  
  Assert.IsTrue(a.Name == b.Name);
  Assert.IsTrue(a.Name.Equals(b.Name));
  Assert.IsTrue(Object.Equals(a.Name, b.Name));
  
  Assert.IsTrue(a.Name == c.Name);
  Assert.IsTrue(a.Name.Equals(c.Name));
  Assert.IsTrue(Object.Equals(a.Name, c.Name));
  
  Assert.IsTrue(a.Name == a.Name);
  Assert.IsTrue(a.Name.Equals(a.Name));
  Assert.IsTrue(Object.Equals(a.Name, a.Name));
  </code></pre>
  
  <p>All these assert passed.</p>
  
  <p>Dumps of certification tests say that <code>Object.Equals(*.Name, *.Name)</code> is the right answer and <code>*.Name.Equals(*.Name)</code> is wrong.</p>
  
  <p>Why?</p>