I agree, enum variable should only contain one of the enumerated values. Here's an example how current way may lead to unexpected result:

enum Foo { A = 1, B }

void bar( Foo foo ) {
   final switch( foo ) {
       case Foo.A:
           writeln( "A" );
           return;
       case Foo.B:
           writeln( "B" );
           return;
   }
   writeln( "Unreachable branch" );
}

int main() {
   bar( Foo.A | Foo.B );
   return 0;
}

It is intuitive to assume that the final switch will always hit one of it's branches, yet this doesn't work here.

Valid example.
As I said one could introduce something like @flags but I guess a library solution is preferred. I still wonder though if implicit conversion to the basetype has any merit.

Reply via email to