枚举类型 - D中的安全性

时间:2013-11-07 13:17:06

标签: casting enums d enumeration type-safety

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

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

1 个答案:

答案 0 :(得分: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);
}

很酷的事实:来!E(字符串)也有效。 to!E(“x”)== E.x,to!string(E.x)==“x”。