 <p>If you could make your <code>IFoo&lt;&gt;</code> interface <strong><em>covariant</em></strong> it would work, that is if you were allowed to change the declaration of it into:</p> <pre><code>public interface IFoo&lt;out T&gt; </code></pre> <p>(note the <code>out</code>). Because with covariance any <code>IFoo&lt;string&gt;</code> would also be an <code>IFoo&lt;object&gt;</code> because <code>string</code> is a reference type and derives from <code>object</code>.</p> <p><em><strong>But:</em></strong> A member of <code>IFoo&lt;&gt;</code>, the <code>Handle</code> method, uses the type parameter in a contravariant manner. So your interface cannot be declared covariant (<code>out</code>). (It could be declared contravariant (<code>in</code>) but that goes in the wrong direction for your example above.)</p> <p>Read up on covariance and contravariance in generics.</p> <p>The fundamental problem here is that your <code>StringFoo</code> handles only strings. Therefore it can never be used as an <code>IFoo&lt;object&gt;</code> because then you could pass for example a <code>Giraffe</code> instance (<code>Giraffe</code> derives from <code>object</code>, so a <code>Giraffe</code> is an <code>object</code>) into the <code>StringFoo</code>, and that is impossible when its <code>Handle</code> takes a <code>string</code>.</p>