有关为枚举变量分配数字的问题

时间:2010-09-18 17:33:43

标签: c# .net enums

我在C#中创建了一个简单的枚举,如下所示

enum Direction
{
    North,
    South,
    East,
    West
}

现在我正在创建一个这个Direction enum的变量:

Direction D = (Direction)3;
Console.WriteLine(D.ToString());

一切顺利,代码按预期工作,并提供以下输出。

West

但现在如果我更改代码有点像:

Direction D = (Direction)8;
Console.WriteLine(D.ToString());

它给出了以下输出:

8

所以最后我想到的问题是:

  1. 为什么在最大可接受值为3时完成此操作。
  2. 如果它在编译时被接受,那么为什么它不会抛出任何异常,而.net框架是如此强大的框架呢。
  3. 最后但并非最不重要,如果一切都没有预料到为什么它会给出输出8。
  4. 先谢谢好友 :)

    GURU

3 个答案:

答案 0 :(得分:1)

  

为什么在最大可接受值为3时完成此操作。

这个假设是不正确的。您可以将枚举基类型范围内的任何值(此处为:int)分配给该枚举类型的变量。

  

如果它在编译时被接受,那么为什么它不会抛出任何异常,而.net框架是如此强大的框架呢。

它不会抛出异常,因为它不是特殊情况,但完全有效。

  

最后但并非最不重要的是,如果一切都没有预料到为什么它会给出输出8。

因为没有枚举成员为值8提供名称。


如果您不希望将具有名称的枚举值传递给方法,则应检查方法的输入:

void Move(Direction d)
{
    if (d != Direction.North && d != Direction.South &&
        d != Direction.East  && d != Direction.West)
    {
        throw new ArgumentOutOfRangeException("d");
    }

    // ...
}

答案 1 :(得分:1)

枚举只是命名常量,如果将值转换为枚举,C#不提供任何范围检查。

1)没有范围检查。查看枚举类似于(通常)更大数字的一组(通常)小名称。即C#允许您为特定值指定名称,但它不限制允许的值,因此如果您强制转换,枚举变量可以采用基础类型的任何值(默认为int)。

2)与1)相同

3)你还期待什么?您尚未为该值指定名称。

您也可以查看this question

答案 2 :(得分:0)

通常,当您声明类似的枚举时,您可以根据列表设置值:

enum Direction{
North,
South,
East,
West}

Direction D = Direction.East;

您尝试将值设置为8后的理由是什么?