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?