On Saturday, October 13, 2012 17:39:23 Tommi wrote: > I'd like to be able to specify a default value for a named enum, > E.init, without creating a new enumeration. There are three > reasons: > 1) Default initializing enum variables to an "invalid" value > 2) Being able to use 'final switch' without the 'init' case > 3) "Invalid" init value wouldn't affect E.min or E.max > > Here's what currently happens: > > enum MyEnum > { > init = -123, > first = 0, > second = 1 > } > > void main() > { > static assert(MyEnum.min == -123); > > MyEnum me; > > final switch (me) > { > case MyEnum.first: break; > case MyEnum.second: break; > case MyEnum.init: // I'm forced to specify init case too > } > } > > This is what I'd like to happen: > > enum MyEnum > { > init = -123, > first = 0, > second = 1 > } > > void main() > { > static assert(MyEnum.min == 0); // no effect on min/max > > MyEnum me; > > final switch (me) // no init case necessary nor allowed > { > case MyEnum.first: break; > case MyEnum.second: break; > } > }
Think about that for a moment. What happens when that final switch statement is actually run? Which statement would MyEnum.init use? The whole point of final switch is that the compile _knows_ that every single value for that type has a case. With your suggestion, it specifically _doesn't_ have a case for one of the type's values. And it _will_ happen at some point that you'll hit a switch like that with the init value rather than a valid one. I don't see how that can possibly work or make any sense at all. And remember, that in many cases, T.init is considered to be perfectly valid. By allowing a final switch _not_ to have it, it then becomes easy to forget to add a case for it when you _need_ to, completely defeating the purpose of the final switch (to make it so that both you and the compiler know that all of the possible values are accounted for). - Jonathan M Davis