Ich entdeckte etwas seltsames, was ich nicht erwartet zu arbeiten, tatsächlich funktioniert. Ich kann eine Unterklasse (konstant) Eigenschaft von der Basisklasse Konstruktor zugreifen:Access Unterklasse 'Eigenschaft von der Basisklasse' Konstruktor
public abstract class Parent {
public Parent() {
var constName = ConstName; // <-- surprisingly, this works
var randomName = RandomName; // <-- surprisingly, this works
}
public abstract string ConstName { get; }
public abstract string RandomName { get; }
}
public class Child : Parent {
public override string ConstName { get { return "Mike"; } }
public override string RandomName { get { return new Random().Next().ToString(); } }
}
Name
ist eine nicht-statische Eigenschaft statt Feld. Ich dachte immer, dass die Initialisierer eines Typs (für und const
Felder) ausgeführt wurden, dann die seiner Basisklasse, dann die Basis-Ctor und dann die Unterklasse "Ctor. Das bedeutet, dass das Kind noch nicht vollständig konstruiert ist, während es im Elternteil ist.
Ist diese "legale" C# unter allen Umständen funktionieren? Warum funktioniert das?
EDIT:
Nein, es ist kein Betrogene Frage. Dieser hat nicht das Klassenschema in meiner Frage.
Sie haben Name Eigentum in Parent! Das ist technisch gesehen legal und korrekt. –
@Nikita Ja, aber Kind ist noch nicht konstruiert. Lesen Sie die Reihenfolge der Initialisierung in meiner Frage. –
Sie sagen also, wenn Sie debuggen und es geht um Basiskonstruktion, Yu Name wie Mike? –