在C#中将int转换为enum
- 论坛
- 在C#中将int转换为enum
18 浏览
在C#中将int转换为enum
在C#中,有一件事我无法理解。你可以将一个超出范围的int
强制转换为一个enum
,而编译器并不会报错。想象一下这个enum
:
enum Colour { Red = 1, Green = 2, Blue = 3 }
现在,如果你写下:
Colour eco; eco = (Colour)17;
编译器认为没问题。运行时也是如此。嗯?
C#团队为什么决定让这种情况成为可能呢?我认为这个决定忽略了使用枚举的初衷,在这种情况下:
void DoSomethingWithColour(Colour eco) { //对eco进行操作。 }
在像C#这样的强类型语言中,我希望假设eco
始终保存一个合法的Colour
值。但事实并非如此。程序员可能会将值为17的eco
传递给我的方法(就像前面的代码片段中一样),因此我的方法中的代码不能假设eco
保存了一个合法的Colour
值。我需要显式地测试并根据需要处理异常值。为什么会这样呢?
依我拙见,如果将一个超出范围的int
强制转换为一个enum
,在int
值在编译时已知的情况下,编译器应该发出错误(甚至警告)消息。如果不是,运行时应该在赋值语句处抛出异常。
你认为呢?有没有任何原因导致现在的情况呢?
(注:这是我很久以前在我的博客上发布的一个问题,但没有得到有用的回答。)