Heim > Backend-Entwicklung > C++ > Warum schlägt die Umwandlung von „MyEntityRepository' in „RepositoryBase' in C# fehl?

Warum schlägt die Umwandlung von „MyEntityRepository' in „RepositoryBase' in C# fehl?

DDD
Freigeben: 2025-01-06 02:07:41
Original
257 Leute haben es durchsucht

Why Does Casting `MyEntityRepository` to `RepositoryBase` Fail in C#?

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;
Nach dem Login kopieren

Diese Umwandlung schlägt fehl, weil RepositoryBase ist eigentlich keine Basisklasse von MyEntityRepository. Daher ist die Umwandlung von MyEntityRepository in RepositoryBase ist ungültig.

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 abgeleiteter Typ, RepositoryBase ersetzen könnte. in den meisten Fällen. Diese Annahme ist jedoch aufgrund möglicher Laufzeitkonflikte nicht allgemein gültig.

Betrachten Sie beispielsweise eine Methode wie diese in RepositoryBase:

void Add(T entity) { ... }
Nach dem Login kopieren

Umwandeln von MyEntityRepository in RepositoryBase würde die Tür zum Hinzufügen von Nicht-MyEntity-Instanzen zum Repository öffnen, was unerwünscht ist. Dies zeigt, dass eine uneingeschränkte kovariante generische Varianz die Integrität der Architektur eines Programms gefährden kann.

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage