How does implementing an interface give us a strongly typed API?
<p>In C# in depth, Jon Skeet uses <code>IEquatable&lt;&gt;</code> to <strike>override</strike> overload the <code>Equals()</code> operation.  </p>

<pre><code>public sealed class Pair&lt;T1, T2&gt; : IEquatable&lt;Pair&lt;T1, T2&gt;&gt;
{
    public bool Equals(Pair&lt;T1, T2&gt; other)
    {
       //...
    }
}
</code></pre>

<p>He says we do this "to give a strongly typed API that'll avoid unnecessary execution-time checks".  </p>

<p>Which execution time checks are avoided?  More importantly, how does implementing an interface achieve a strongly typed API?</p>

<p>I may have missed something in the book's context. I thought interfaces gave us code re-use via polymorphism.  I also understand that they are good for programming to an abstraction instead of a concrete type.  That's all I'm aware of.</p>
