Implicit enum conversions are a stupid PITA

yigal chripun yigal100 at gmail.com
Wed Mar 24 13:16:17 PDT 2010


Nick Sabalausky Wrote:

> "yigal chripun" <yigal100 at gmail.com> wrote in message 
> news:hobg4b$12ej$1 at digitalmars.com...
> >
> > This also interacts with the crude hack of "this enum is actually a 
> > constant".
> > if you remove the implicit casts than how would you be able to do:
> > void foo(int p);
> > enum { bar = 4 }; // don't remember the exact syntax here
> > foo(bar); // compile-error?!
> >
> 
> AIUI, That style enum is already considered different by the compiler 
> anyway. Specifically, it's doesn't create any new type, whereas the other 
> type of enum creates a new semi-weak type. I don't think it would be too big 
> of a step to go one step further and change "this kind of enum creates a new 
> semi-weak type" to "this kind of enum creates a new strong type". But yea, I 
> absolutely agree that calling a manifest constant an "enum" is absurd. It 
> still bugs the hell out of me even today, but I've largely shut up about it 
> since Walter hasn't wanted to change it even though he seems to be the only 
> one who doesn't feel it's a bad idea (and it's not like it causes practical 
> problems when actually using the language...although I'm sure it must be a 
> big WTF for new and prospective D users).
> 
> 
> > I feel that enum needs to be re-designed. I think that C style "enums are 
> > numbers" are *bad*, *wrong* designs that expose internal implementation 
> > and the only valid design is that of Java 5.
> >
> > e.g.
> > enum Color {blue, green}
> > Color c = Color.blue;
> > c++; // WTF?  should NOT compile
> >
> > A C style enum with values assigned is *not* an enumeration but rather a 
> > set of meaningful integral values and should be represented as such.
> >
> > This was brought up many many times in the NG before and based on past 
> > occurences will most likely never change.
> 
> I would hate to see enums lose the concept of *having* a base type and base 
> values because I do find that to be extremely useful (Haxe's enums don't 
> have a base type and, from direct experience with them, I've found that to 
> be a PITA too). But I feel very strongly that conversions both to and from 
> the base type need to be explicit. In fact, that was one of the things that 
> was bugging me about C/C++ even before I came across D. D improves the 
> situation of course, but it's still only half-way.
> 
> 
> 

Regarding the base type notion, I re-phrased my inccurate saying above in a reply to my post. I don't agree that enums should have a base type, enums should be distinct storng types.
The numeric value should be a *property* of an enum member and not define its identity. 
Which is how it works in Java 5 where each each member is a singelton class. 

you should never do:
void foo(int); 
foo(MyEnum.Bar); // this is bad design
instead do:
foo(MyEnum.Bar.value); // value is a regular property.

This is also more flexible, since you could do things like:
// assume I defined a Color enum
foo(Color.Red.ordinal);
bar(Color.Red.rgb);

where foo belongs to an API that defines a a list of colors (red is 5)and bar belongs to a different API that uses the rgb value (red is 0xff0000)

how would you do that with a C style enum?




More information about the Digitalmars-d mailing list