C # Explizite Operatoren und Vererbung

8

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?

    
Andy 06.06.2011, 12:06
quelle

2 Antworten

15
  

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%     
Konrad Rudolph 06.06.2011, 12:09
quelle
2

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:

%Vor%

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.)

    
Jon Skeet 06.06.2011 12:10
quelle

Tags und Links