== and Equals. Why the complexity?
<p>With <code>==</code> operator I can do this:</p>

<pre><code>int a = 10;
int b = 10;
a==b //true
</code></pre>

<p>In this case C# makes a compile-time decision, and no virtual behavior comes into play.</p>

<p>But, if I use:</p>

<pre><code>object a = 10;
object b = 10;
a == b //false
</code></pre>

<p>The result is false because <code>object</code> is a class (reference type)  and <code>a</code> and <code>b</code> each refer to different boxed objects on the heap.</p>

<p>To solve it I should do:</p>

<pre><code>object a = 10;
object b = 10;
a.Equals (b) // True
</code></pre>

<p>Because <code>Equals</code> is a virtual method and it is resolved at runtime depending of the objects’s actual type.</p>

<p>My question is:</p>

<p><strong>Why the designers of C# didn’t avoid the problem by making == virtual, and so functionally identical to Equals?</strong></p>
