On 4/21/20 3:00 PM, Russel Winder wrote:
On Tue, 2020-04-21 at 12:59 -0400, Steven Schveighoffer via
Digitalmars-d-learn wrote:
On 4/21/20 12:03 PM, Russel Winder wrote:
Hi,
Given an enum:
enum ZoneNumber {
One = 1,
Two = 2,
}
then which of these is the right way of accessing the value?
cast(ubyte)ZoneNumber.One
to!ubyte(ZoneNumber.One)
I generally do this:
ubyte(ZoneNumber.One)
Hummm… I hadn't got to that one. :-)
Why choose that rather than one of the other two?
1. it's shorter and prettier.
2. No cast (I avoid using cast whenever I can).
3. No gotcha type conversions.
e.g. for point 3:
enum ZoneMember { // : int
One = 1,
Two = 2,
ReallyBig = 4567,
}
auto b1 = ubyte(ZoneNumber.One); // 1 (compiler uses VRP to make this work)
auto b2 = ubyte(ZoneNumber.ReallyBig); // Compiler error
vs.
auto b1 = cast(ubyte)ZoneNumber.One; // 1
auto b2 = cast(ubyte)ZoneNumber.ReallyBig; // b2 == 215 (truncated)
vs.
auto b1 = to!ubyte(ZoneNumber.One); // 1
auto b2 = to!ubyte(ZoneNumber.ReallyBig); // runtime error
conversely what is the right way of going the other way:
cast(ZoneNumber)1
This will incur zero runtime cost, so I would recommend that.
to!ZoneNumber(1)
This works too, I think it just does the equivalent of the first, but
if
not inlined, you will incur some runtime cost.
I tried:
enum ZoneNumber : ubyte {
One = 1,
Two = 2,
}
but the members One and Two still seem to be types as int. :-(
They are typed as ZoneNumber, which is a derivative of ubyte. What
measurement are you doing to determine that they are int?
typeof(ZoneNumber.One).stringof seemed to return uint.
This is what happens for me:
enum ZoneNumber : ubyte {
One = 1,
Two = 2,
}
pragma(msg, typeof(ZoneNumber.One).stringof); // ZoneNumber
-Steve