On 4/21/20 2:09 PM, tsbockman wrote:
conversely what is the right way of going the other way:

cast(ZoneNumber)1
to!ZoneNumber(1)

Use `to` except where you can gaurantee that the input value maps to a valid enum member, because `cast` does not check your work:

     writeln(cast(ZoneNumber)17); // breaks the type system
    writeln(to!ZoneNumber(17)); // throws a ConvException: Value (17) does not match any member value of enum 'ZoneNumber'

So, `cast` is faster, but unsafe. `to` is slower, but protects the enum's invariant.

I just want to correct this and say there isn't a type system requirement for the enum to be only one of the selected values, even in safe code.

e.g.:

enum flags {
  one = 1,
  two = 2,
}

flags f = flags.one | flags.two; // ok
++f; // ok also

In essence, an enum acts as a derived type with named constants.

Also, there is one situation where you can't use to -- a string-based enum:

enum sym : string {
   s = "s value",
   y = "y value"
}

auto a = cast(sym)"s value"; // ok
assert(a == sym.s);

auto b = to!sym("s value"); // runtime error

This is because to!someEnum(string) is specialized to look at the enum names only, not the values.

-Steve

Reply via email to