How do I extend an enum?

Basile B. via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Mar 19 16:03:15 PDT 2016


On Saturday, 19 March 2016 at 17:40:27 UTC, Lass Safin wrote:
> Why:
>
> enum Base {
>     A,
>     B,
> }
>
> enum Derived : Base {
>     C, // Gives error, says it can't implicitly convert 
> expression to Base.
>     D = 1, // Same error
>     E = cast(Base)294, // Finally works. Can only be 
> cast(Derived) instead.
> }
>
> void func(Derived d) {}
>
> func(Derived.E); // works.
> func(Derived.A); // Gives error, says it can't call function 
> with Base.A.
> func(cast(Derived)Derived.A); // Works.
>
> So, what's the proper way of extending an enum?

Look at the grammar:

https://dlang.org/spec/enum.html

There's no inheritance system for the enums. after the ":" can 
only be specified the type of the members, aka the "EnumBaseType".

"
EnumDeclaration:
     enum Identifier EnumBody
     enum Identifier : EnumBaseType EnumBody
"

So when you write

enum Derived : Base {}

It just means that "Derived" members must be of type "Base"

So actually the only thing you can do is to reduce the members 
count:

enum Base {A,B}
enum Derived : Base {C = Base.A}





More information about the Digitalmars-d-learn mailing list