Generika und Umwandlung: Die Umwandlungsbeschränkung verstehen
Obwohl es häufig vorkommt, kann die Umwandlung geerbter Klassen in Basisklassen schwierig sein, wie am Beispiel von Beim Versuch des folgenden Codes ist eine Laufzeitausnahme aufgetreten:
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;
Diese Umwandlung schlägt fehl, weil RepositoryBase
Der Grund für diese Einschränkung liegt im Konzept der generischen Varianz. Generische Varianz bezieht sich auf die Fähigkeit eines Typs, seine Parametrisierung auf kovariante oder kontravariante Weise zu ändern. Allerdings wird diese Form der generischen Varianz in C# nur teilweise unterstützt, hauptsächlich für generische Schnittstellen und Delegaten.
In einem allgemeineren Kontext ermöglicht eine kovariante Variation, dass ein abgeleiteter Typ seinen Basistyp in einem bestimmten Szenario ersetzt . Das bedeutet, dass MyEntityRepository, ein von RepositoryBase
Betrachten Sie beispielsweise eine Methode wie diese in RepositoryBase
void Add(T entity) { ... }
Umwandeln von MyEntityRepository in RepositoryBase
In C# 4 ist generische Varianz für Referenztypen in generischen Schnittstellen und Delegaten zulässig, nicht jedoch für Klassen. Ausführlichere Informationen finden Sie in der MSDN-Dokumentation von Microsoft, in der Blogreihe von Eric Lippert oder im Video einer Präsentation, die im Juli 2010 beim NDC gehalten wurde.
Das obige ist der detaillierte Inhalt vonWarum schlägt die Umwandlung von „MyEntityRepository' in „RepositoryBase' in C# fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!