проблема с присвоением чисел переменной enum - PullRequest
0 голосов
/ 18 сентября 2010

Я создал простое перечисление в C # следующим образом

enum Direction
{
    North,
    South,
    East,
    West
}

Теперь я создаю переменную этого перечисления Direction как:

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

Все идет хорошо, и код работает, как ожидалось, и выдает следующее:

West

но теперь, если я изменю код немного как:

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

выдает следующее:

8

Итак, наконец, у меня возникли следующие вопросы:

  1. Почему это делается, когда максимально допустимое значение равно 3.
  2. Если он принимается во время компиляции, то почему он не выдает никаких исключений, в то время как .net Framework пока еще такая надежная платформа
  3. И, наконец, но не в последнюю очередь, если все идет не так, как ожидалось, почему он выдает результат 8.

Спасибо заранее приятелям :)

GURU

Ответы [ 3 ]

1 голос
/ 18 сентября 2010

Перечисления являются просто именованными константами, и C # не предлагает никакой проверки диапазона, если вы приводите значение к перечислению.

1) Проверка диапазона отсутствует.Посмотрите на перечисления как (обычно) небольшой набор имен для (обычно) гораздо большего набора чисел.Т.е. C # позволяет вам присваивать имена определенным значениям, но не ограничивает допустимые значения, поэтому переменная enum может принимать любое значение базового типа (по умолчанию int), если вы приведете его.

2) То же, что 1) действительно

3) Чего еще вы ожидаете.Вы не назначили имя для этого значения.

Вы можете также проверить этот вопрос .

1 голос
/ 18 сентября 2010

Почему это делается, когда максимально допустимое значение равно 3.

Это предположение неверно. Вы можете назначить любое значение, которое находится в пределах диапазона базового типа перечисления (здесь: int), переменной этого типа перечисления.

Если он принимается во время компиляции, то почему он не выдает никаких исключений, в то время как .net Framework пока еще такой надежный каркас.

Это не исключение, потому что это не исключительная ситуация, но вполне допустимо.

И, наконец, но не в последнюю очередь, если все идет не так, как ожидалось, почему он выдает результат 8.

Поскольку нет члена enum, который присваивает имя значению 8.


Если вы не хотите, чтобы значение перечисления, отличное от значений с именем, передавалось методу, вы должны проверить входные данные метода:

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

    // ...
}
0 голосов
/ 18 сентября 2010

Обычно, когда вы объявляете перечисление, вы устанавливаете значения в соответствии со списком:

enum Direction{
North,
South,
East,
West}

Direction D = Direction.East;

Что вы думаете за попытку установить значение 8?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...