Maison >développement back-end >C++ >Pourquoi la conversion de « MyEntityRepository » en « RepositoryBase » échoue-t-elle en C# ?
Génériques et conversion : comprendre la limitation de conversion
Malgré son phénomène courant, la conversion de classes héritées en classes de base peut être délicate, comme en témoigne une exception d'exécution rencontrée lors de la tentative du code suivant :
public abstract class EntityBase { } public class MyEntity : EntityBase { } public abstract class RepositoryBase<T> where T : EntityBase { } public class MyEntityRepository : RepositoryBase<MyEntity> { } MyEntityRepository myEntityRepo = GetMyEntityRepo(); // whatever RepositoryBase<EntityBase> baseRepo = (RepositoryBase<EntityBase>)myEntityRepo;
Ce casting échoue car RepositoryBase
La raison sous-jacente de cette limitation réside dans le concept de variance générique. La variance générique fait référence à la capacité d'un type à modifier ses paramétrages de manière covariante ou contravariante. Cependant, cette forme de variance générique n'est que partiellement prise en charge en C#, principalement pour les interfaces génériques et les délégués.
Dans un contexte plus générique, une variation covariante permet à un type dérivé de remplacer son type de base dans un scénario donné. . Cela signifie que MyEntityRepository, un type dérivé de RepositoryBase
Par exemple, considérons une méthode comme celle-ci dans RepositoryBase
void Add(T entity) { ... }
Casting MyEntityRepository vers RepositoryBase
En C# 4, la variance générique est autorisée pour les types de référence au sein des interfaces génériques et des délégués, mais pas pour les classes. Pour des informations plus détaillées, reportez-vous à la documentation MSDN de Microsoft, à la série de blogs d'Eric Lippert ou à la vidéo d'une présentation donnée au NDC en juillet 2010.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!