Подтвердить что ты не робот

Почему перечисления требуют явного приведения в тип int?

Потеря данных при этом не происходит, поэтому зачем нужно явно вводить перечисления в ints?

Не было бы более интуитивным, если бы оно было неявным, скажем, когда у вас есть метод более высокого уровня, например:

PerformOperation ( OperationType.Silent type )

где PerformOperation вызывает обернутый метод С++, который отображается как таковой:

_unmanaged_perform_operation ( int operation_type )
4b9b3361

Ответ 1

Существует два основных и непоследовательных использования перечислений:

enum Medals
{ Gold, Silver, Bronze }

[Flags]
enum FilePermissionFlags
{
    CanRead = 0x01,
    CanWrite = 0x02,
    CanDelete = 0x04
}

В первом случае нет смысла рассматривать эти вещи как числа. Тот факт, что они хранятся в виде целых чисел, является детальностью реализации. Вы не можете логически добавлять, вычитать, умножать или делить золото, серебро и бронзу.

Во втором случае также не имеет смысла рассматривать эти вещи как числа. Вы не можете добавлять, вычитать, умножать или делить их. Единственными разумными операциями являются побитовые операции.

Перечисления являются паршивыми числами, поэтому вы не должны иметь возможность рассматривать их как числа случайно.

Ответ 2

Поскольку перечисления не должны быть int на основе:

Ключевое слово enum используется для объявления перечисление, отдельный тип состоящий из набора именованных констант называемый списком перечислителей. каждый тип перечисления имеет тип, который может быть любым интегральным типом кроме char.

Итак, вы можете сделать что-то вроде этого:

enum Something :long  { valueX = 0, valueY = 2147483648L }

Ответ 3

Почему вы говорите, что нет потери данных? В конце концов, не все перечисления. Они должны быть целыми, но это может означать байт, улунг и т.д.

В качестве краевого случая литерал 0 неявный, но; что бы вы делали здесь?

Довольно редко мне нужно это делать - обычно импорт данных и т.д. Случайный листинг no-op имеет для меня прекрасный смысл и позволяет избежать случайных ошибок.

Ответ 4

Не было бы более интуитивным, если бы оно было неявным, скажем, когда у вас есть метод более высокого уровня, например:

На самом деле я не думаю. В этом случае вы пытаетесь использовать Enum в случае с краем.

Однако, если перечисления были неявно преобразованы в целые значения, это резко снизило бы их эффективность. Являясь принудительным преобразованием int явно, компилятор обрабатывает enum как особый тип - один из многих вариантов, а не как целое. Это более четко демонстрирует намерение перечисления и уменьшает вероятность ошибок программиста (т.е. Присваивает значения, которые не определены в перечислении для переменной перечисления и т.д.).

Я лично рад, что перечисление в С# больше, чем (эффективно) значение константы int.

Ответ 5

Так работает С#...

Если Enum унаследовал от int, это должно быть возможно. Enum не наследует от int, и поэтому требуется бросок.

Единственный способ неявных классов классов - это если они наследуют.

Ответ 6

Я думаю, что ответ на вопрос "Почему перечисления требуют явного приведения в тип int?" что сильно типизированные перечисления в соответствии с С# являются полезной защитой от общих ошибок программирования.

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

enum Textures { Gloss, Satin, Matt };
enum Colors { White, Green, Red, Blue, Brown };

И метод такой комнаты:

private void PaintRoom (Textures texture, Colors color)

На языке с сильным перечислением enum, как в С#, такая команда:

 // nonsensical attempt to have texture=White and color=Matt
PaintRoom(Colors.White, Textures.Matt);

... выполнил бы ошибку времени компиляции (не может помещать цвет туда, где ожидается текстура, и наоборот). Но в языках, где перечисления не являются строго типизированными и/или неявное преобразование может иметь место (включая C и С++), и наши Colors, и наши Textures могут рассматриваться как int, поэтому мы можем с радостью PaintRoom(Colors.White, Textures.Matt), и он будет компилироваться отлично, но в итоге мы получим комнату, окрашенную Gloss Red (0, 2), а не Matt White (2, 0), которую мы намеревались, и код, который быстро просматривается, кажется, говорит.

Таким образом, строго типизированные перечисления - это, в основном, хорошая вещь, чтобы люди не случайно помещали перечисления в места, для которых они не предназначались. И где кто-то действительно хочет, чтобы их перечисление было int, С# заставляет кодера сделать свое намерение ясным, настаивая на явном преобразовании.

Ответ 7

Как говорили другие, невозможно изменить требуемый отбор с EnumType до int. Однако есть несколько способов обхода. Например, у меня есть несколько перечислений, которые относятся к подобным вещам, и хотели бы иметь возможность назначить любую из них переменной. Поэтому я пошел с:

public ValueType State {
    get {
        return state;
    }
    set {
        state = (int)value;
    }
}

и, таким образом, я мог бы сказать как playerObject.animator.State = Player.STANDING, так и monsterObject.animator.State = Monster.DROOLING, неявно, насколько мог сказать вызывающий класс.

Кроме того, да, есть законная причина, по которой я должен рассматривать значения enum как числа.