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