在C#中将int转换为enum

18 浏览
0 Comments

在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值在编译时已知的情况下,编译器应该发出错误(甚至警告)消息。如果不是,运行时应该在赋值语句处抛出异常。

你认为呢?有没有任何原因导致现在的情况呢?

(注:这是我很久以前在我的博客上发布的一个问题,但没有得到有用的回答。)

0