Ma question concerne les classes de diffusion à l'intérieur d'un type générique. Bien que je sache que lancer des objets comme List<string>
à List<object>
nécessite la prise en charge de la covariance pour éviter d'ajouter des objets object
à une liste contenant des chaînes, je me demande pourquoi une distribution comme ci-dessous n'est pas acceptée par le compilateur et si elle peut être résolue en utilisant des interfaces. ou contravariance:Génériques, héritage et diffusion
public class TypeA<T> {}
public class TypeB<T> {}
public class TypeC : TypeB<int> {}
class Program
{
public static void MyMethod<OutputType>(TypeA<TypeB<OutputType>> Parameter) {}
static void Main(string[] args)
{
TypeA<TypeC> Test = new TypeA<TypeC>();
MyMethod<int>(Test);
}
}
Compiler cela se traduit par une erreur:
Argument 1: cannot convert from 'ConsoleApplication1.TypeA<ConsoleApplication1.TypeC>' to 'ConsoleApplication1.TypeA<ConsoleApplication1.TypeB<int>>'
.
même si TypeC
est un descendant direct de TypeB<int>
Il s'avère que c'était un manque de compréhension de ma part sur la façon dont la covariance fonctionne avec les interfaces. Comme Eric le souligne dans sa réponse, TypeB et TypeC sont analogues à la casse de liste. Une solution similaire résout en fait mon problème spécifique, merci beaucoup. –