Il n'est pas possible d'hériter d'un struct C#. La raison n'est pas évidente pour moi :
- Il est évident que vous ne pouvez pas avoir un type de référence qui hérite d'un type de valeur ; cela ne fonctionnerait pas.
- Il ne semble pas raisonnable d'hériter d'un des types primitifs (Int32, Double, Char, etc.).
- Il faudrait pouvoir appeler des méthodes (non virtuelles) sur la base en utilisant une instance dérivée. Vous pourriez faire un cast d'une structure dérivée vers la base, puisqu'elles recouvriraient la même mémoire. Je suppose que le casting d'une base vers une structure dérivée ne fonctionnerait pas, puisque vous ne pourriez pas connaître le type de la structure dérivée au moment de l'exécution.
- Je vois que vous ne pouvez pas implémenter de méthodes virtuelles dans votre hiérarchie de classes, puisque les types de valeurs ne peuvent pas avoir de membres virtuels.
Je me demande s'il s'agit d'une limitation technique du CLR ou de quelque chose que le compilateur C# vous empêche de faire ?
Edit : Les types de valeurs ne peuvent pas avoir de méthodes virtuelles, et je réalise que cette limitation exclut la plupart des scénarios dans lesquels vous voudriez utiliser l'héritage. Mais il reste l'héritage en tant qu'agrégation. Imaginez un Shape
struct avec un Colour
domaine : Je peux écrire du code qui accepte n'importe quelle structure dérivée de Shape
et d'accéder à son Colour
même si je ne pourrai jamais écrire un champ virtuel Shape.Draw
méthode.
Je peux penser à un scénario qui serait brisé par des types de valeurs non scellés. Les types de valeurs sont censés implémenter Equals
et GetHashCode
correctement ; même si ces deux méthodes sur System.Object
sont virtuels, ils sont appelés de manière non virtuelle sur les types de valeurs. Même si les types de valeurs n'étaient pas scellés, quelqu'un qui écrirait une structure dérivée d'une autre ne pourrait pas écrire sa propre implémentation de ces deux méthodes et espérer qu'elles soient appelées correctement.
Je dois préciser que je ne suggère pas que je devrais pouvoir hériter de structs dans mon propre code. Ce que j'essaie de faire, cependant, c'est de deviner pourquoi cette odeur de code particulière est interdite par .NET.
Edit 2 : Je viens de repérer cette question très similaire La réponse à cette question est effectivement "parce que les tableaux de types de valeurs ne fonctionneraient pas".