La restricción genérica ignora la covarianza
Digamos que tenemos una interfaz como
public interface IEnumerable<out T>
{ /*...*/ }
es decircovariante enT
.
Luego tenemos otra interfaz y una clase que lo implementa:
public interface ISomeInterface {}
public class SomeClass : ISomeInterface
{}
Ahora la covarianza nos permite hacer lo siguiente
IEnumerable<ISomeInterface> e = Enumerable.Empty<SomeClass>();
Entonces unIEnumerable<SomeClass>
es asignable a una variable (o parámetro de método) de tipoIEnumerable<ISomeInterface>
.
Pero si intentamos esto en un 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) {}
obtenemos elerror del compilador CS0266 diciéndonos que unIEnumerable<T>
no se puede convertir en unIEnumerable<ISomeInterface>
.
La restricción establece claramente elT
se deriva deISomeInterface
, y desdeIEnumerable<T>
es co-variante enT
, esta asignación debería funcionar (como se muestra arriba).
¿Hay alguna razón técnica por la cual esto no puede funcionar en un método genérico? ¿O algo que me perdí que hace que sea demasiado costoso para el compilador resolverlo?