An idea (Re: Implicit enum conversions are a stupid PITA)
Nick Sabalausky
a at a.a
Thu Mar 25 11:18:24 PDT 2010
"Don" <nospam at nospam.com> wrote in message
news:hof6fe$6ah$1 at digitalmars.com...
>
> I think there might be some low-hanging fruit, though.
> Supposed we distinguished enums containing AssignExpressions from those
> which do not.
> It seems clear to me that logical operations should always be permitted on
> enums where every member of the enum has been explicitly assigned a value.
> enum Enum1 { A = 1, B = 2, C = 4 }
> ---> A|B makes sense.
>
> But if there are no assign expressions at all:
> enum Enum2 { A, B, C }
> then I think that performing arithmetic on that enum is almost certainly a
> bug.
>
> The case where only some of the enum members have assign expressions is
> less clear. Some cases, such as synonyms { A, B, C=B } aren't really any
> different from the no-assign expression case. But other cases are less
> clear, so I'll just ignore them all. So I propose a simple rule:
>
> Suppose that implicit integral conversions (and arithmetic/logical
> operations) involving enums were permitted ONLY if the enum has at least
> one AssignExpression.
>
> This would catch some bugs, without (I think) causing much pain for valid
> code. At the very least, this is something I'd want in a lint tool. (But
> note that it wouldn't fix the issue in the original post).
>
If I understand that right, I think that side-steps what I see as the
important goal: To *have* an associated value with each enum member but just
have to be explicit about obtaining it. The above scheme doesn't really
bring things significantly closer to that, you have to make a choice between
type-safety and being able actually have an underlying value at all. So when
you need an associated value but you're not doing bitfields/flags (which is
a situation I find to be very common for enums), then that solution provides
no improvement over the current state.
Here's the low-hanging fruit I see:
Step 1: Remove implicit enum->base-type conversions
Step 2: Allow '|' (and maybe '&'?) on enums, and consider the result of the
operation be the base type.
Certainly not ideal, but it provides far more type-safety than we currently
have on non-bitfield/non-flag enums, even if you're using associated values,
and still allows enums to be used for bitfields/flags without any code
breakage or ugly "cast(int)Foo.a | cast(int)Foo.b".
More information about the Digitalmars-d
mailing list