Ну, часть проблемы заключается в том, что ключевое слово enum
, возможно, используется в D. Анонимное перечисление иногда называется константой манифеста. Объявление
enum : string
{
anon1 = "pen",
anon2 = "sword",
}
в основном такая же, как
enum string anon1 = "pen";
enum string anon2 = "sword";
или
enum anon1 = "pen";
enum anon2 = "sword";
, так как они будут подразумеваться, как string
в любом случае. Это действительно не перечисления. Просто вы объявили их в блоке, а не отдельно. Они больше похожи на # определение константы в C, в которой вы объявляете символ, который не имеет адреса, и просто будет заменен значением, которое было назначено там, где этот символ используется. Как правило, это не список связанных значений, например enum
. На самом деле, эти утверждения не удастся:
assert(is(typeof(anon1) == enum));
assert(is(typeof(anon2) == enum));
И это потому, что они явные константы, а не на самом деле Перечисления в традиционном смысле этого слова. Контраст, что с
assert(is(typeof(strs.Foo) == enum));
assert(is(typeof(strs.Bar) == enum));
, который пройдет - потому что strs
является фактическим enum
, а не проявляется постоянной (хотя перечисления подобны проявляться константами в том, что они не имеют никакого адреса, и при их использовании, они просто заменяются с их значением - что может быть частью того, почему манифестационные константы также используют ключевое слово enum
).
Таким образом, с точки зрения writefln
«s, anon1
и anon2
это просто строки, и он будет печатать их, как и любую строку, в то время как Foo
и Bar
являются перечисления, и поэтому он будет печатать их имена.Внутренне, writefln
использует is(T == enum)
, чтобы проверить, является ли что-то enum
, и точно так же, как и с этими утверждениями, только те, которые являются фактическими перечислениями, а не манифестными константами, приведут к тому, что это выражение будет истинным, так что это те, которые получают их имена распечатаны.