A restrição genérica ignora a co-variação

Digamos que temos uma interface como

public interface IEnumerable<out T>
{ /*...*/ }

isso éco-variante noT.

Então temos outra interface e uma classe implementando-a:

public interface ISomeInterface {}
public class SomeClass : ISomeInterface
{}

Agora, a covariância nos permite fazer o seguinte

IEnumerable<ISomeInterface> e = Enumerable.Empty<SomeClass>();

Então umIEnumerable<SomeClass> é atribuível para uma variável (ou parâmetro de método) do tipoIEnumerable<ISomeInterface>.

Mas se tentarmos isso em um método genérico:

public void GenericMethod<T>(IEnumerable<T> p) where T : ISomeInterface
{
    IEnumerable<ISomeInterface> e = p;
    // or
    TestMethod(p);
}
public void TestMethod(IEnumerable<ISomeInterface> x) {}

nós obtemos oerro do compilador CS0266 nos dizendo que umIEnumerable<T> não pode ser convertido em umIEnumerable<ISomeInterface>.

A restrição afirma claramente aT é derivado deISomeInterface, e desdeIEnumerable<T> é co-variante emT, essa tarefa deve funcionar (como mostrado acima).

Existe alguma razão técnica para isso não funcionar em um método genérico? Ou qualquer coisa que eu perdi que torna muito caro para o compilador descobrir isso?

questionAnswers(1)

yourAnswerToTheQuestion