2

D 中枚举类型安全的状态和计划是什么?

我期望

import std.stdio: writeln;

void main(string args[]) {
    enum E {x, y, z}
    E e;
    writeln(e);
    e = cast(E)3;
    writeln(e);
}

由于 D 的其他强大的静态类型/范围检查而无法编译,或者至少在运行时给出 RangeException。

令我惊讶的是,它改为打印

cast(E)3

这真的是大多数用例的首选默认行为吗?如果是这样,是否有人编写了一些包装器类型,最好在编译时提供更严格的范围检查?

4

1 回答 1

5

cast意味着您将事情掌握在自己手中,并且您可以用它做任何事情-有用,就像棘轮怪胎所说的那样,可用于组合标志。(虽然,在这些情况下,我喜欢为每个项目提供一个确切的类型和明确的值,以确保一切都按照我的意愿行事,所以 enum : ubyte { x = 1, y = 2, z = 4},那种事物)

无论如何,有一种方法可以在这种情况下获取运行时异常:使用 std.conv.to:

import std.conv;
import std.stdio;

void main() {
    enum E {x, y, z}
    E e;
    writeln(e);
    e = to!E(2); // gives z, whereas to!E(3) throws an exception
    writeln(e);
}

很酷的事实:to!E(string) 也有效。to!E("x") == Ex,和 to!string(Ex) == "x"。

于 2013-11-07T14:26:49.390 回答