Warum sind .NETTO-Wert-Typen versiegelt?

Es ist nicht möglich, Erben von einem C# struct. Es ist mir nicht klar, warum das so ist:

  • Klar man kann nicht ein Referenz-Typ erbt von einem Wert-Typ; würde dies nicht funktionieren,
  • Es klingt nicht vernünftig zu Erben von einem der primitiven Typen (Int32, Double, Char, etc).
  • Sie müssten in der Lage sein zu rufen (nicht-virtuellen) Methoden auf der Basis einer abgeleiteten Instanz. Sie konnte Stimmen aus einem der abgeleiteten Struktur der base, da würden Sie sich den gleichen Speicher. Ich denke, eine Umwandlung von einer Basis abgeleitet würde nicht funktionieren, da Sie nicht wissen konnte, die Art der abgeleiteten Struktur zur Laufzeit.
  • Ich kann sehen, dass Sie nicht implementieren die virtuellen Methoden in der Klassenhierarchie, da Wert-Typen können keine virtuellen Mitglieder

Frage ich mich, ob dies ist eine technische Einschränkung in der CLR, oder etwas, dass der C# - compiler nicht mehr tun?

Edit: Wert-Typen können nicht virtuelle Methoden, und ich begreife, dass diese Einschränkung Regeln, die meisten Szenarien, in denen Sie wollen, um die Vererbung verwenden. Dass noch die Blätter der Vererbung-als-aggregation, obwohl. Stellen Sie sich eine Shape Struktur mit einer Colour Feld: ich kann code schreiben, der nimmt eine beliebige struct abgeleitet von Shape und auf Ihr Colour Feld, auch wenn ich nie schreiben, ein virtuelles Shape.Draw Methode.

Ich denken kann, ein Szenario, das bekommen würden, gebrochen durch die nicht versiegelten Wert-Typen. Wert-Typen sollen zu implementieren Equals und GetHashCode richtig; auch wenn diese beiden Methoden auf System.Object virtuell sind, bekommen Sie als nicht-virtuell auf Wert-Typen. Auch wenn Werte-Typen waren nicht versiegelt, jemand schreiben, eine Struktur, die von einer anderen abgeleitet, könnte man gar nicht schreiben Ihre eigene Implementierung dieser beiden Methoden, und erwarten, dass Sie ordnungsgemäß aufgerufen.

Ich darauf hinweisen, dass ich bin nicht dafür, ich sollte in der Lage sein, die Vererbung von Strukturen in meinem eigenen code. Was ich versuche zu tun, obwohl, ist zu erraten, warum diese Besondere code, der Geruch ist verboten .NET.

Edit 2: ich habe gerade entdeckt diese sehr ähnlichen Frage, die Antwort auf die effektiv ", weil dann arrays von Werttypen nicht funktionieren würde".

InformationsquelleAutor Tim Robinson | 2009-11-20
Schreibe einen Kommentar