Ich bin mir sicher, dass das eine dumme Frage ist, aber warum ruft der folgende Code nicht den expliziten Operator für die Besetzung der Kindklasse MyBool auf?
%Vor%dann:
%Vor%Erzeugt die Ausgabe: false, false
Ist meine einzige Option, Funktionen für jede Klasse zu schreiben, um die expliziten Operatorfunktionen zu ersetzen?
Warum ruft der folgende Code den expliziten Operator für den Cast für die untergeordnete Klasse MyBool nicht auf?
Weil die Operatorfunktionen static
, also auch nicht virtual
sind und ihr Ziel daher zu Kompilierzeit und nicht zur Laufzeit aufgelöst wird. Dies ist das erwartete Verhalten.
Wenn Sie polymorphe Konvertierungsoperatoren haben möchten, können Sie virtuelle Funktionen innerhalb der Operatoren aufrufen:
%Vor% Operatoren werden überladen und nicht überschrieben - mit anderen Worten, die Auswahl, welche Implementierung verwendet werden soll, erfolgt bei Kompilierzeit . Der Compiler kennt nur T
als DataType
, also ruft er den Operator in DataType
auf.
Eine Option wäre, den Operator aus MyBool
zu entfernen, aber eine virtuelle Methode in DataType
hinzuzufügen, um polymorphes Verhalten zu ermöglichen:
Beachten Sie, dass nicht für die Konvertierung von bool
in DataType
funktioniert, da wir in diesem Fall keine Informationen darüber haben, welcher Subtyp von DataType
Sie tatsächlich haben möchte erstellen.
(Randnotiz: Ihr Code wäre einfacher zu folgen, wenn Sie die normalen .NET-Namenskonventionen verwenden würden.)
Tags und Links c# operator-overloading