Nor*_*löw 2 enums enumeration casting d 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);
}
Run Code Online (Sandbox Code Playgroud)
由于D的强大静态类型/范围检查或至少在运行时给出RangeException而无法编译.
令我惊讶的是,它打印出来
cast(E)3
Run Code Online (Sandbox Code Playgroud)
这是否是大多数用例的首选默认行为?如果是这样,有人写了一些包装类型,在编译时更好地提供更严格的范围检查吗?
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);
}
Run Code Online (Sandbox Code Playgroud)
很酷的事实:to!E(字符串)也有效.to!E("x")== Ex,to!string(Ex)=="x".