Я думаю, что ответ на вопрос "Почему перечисления требуют явного приведения к типу int?"является то, что строго типизированные перечисления в соответствии с C # являются полезной защитой от распространенных ошибок программирования.
Представьте, что у меня есть приложение для управления рисованием, основанное на двух перечислениях:
enum Textures { Gloss, Satin, Matt };
enum Colors { White, Green, Red, Blue, Brown };
И комната -Метод рисования, подобный следующему:
private void PaintRoom (Textures texture, Colors color)
На языке с сильным типом перечисления, как в C #, такая команда:
// nonsensical attempt to have texture=White and color=Matt
PaintRoom(Colors.White, Textures.Matt);
... приведет к ошибке во время компиляции (не могу поместить цвет туда, где ожидается текстура и наоборот).Но в языках, где перечисления не являются строго типизированными и / или может происходить неявное преобразование (включая C и C ++), и наши Colors
, и наши Textures
могут рассматриваться как int
, поэтому мы можем с радостью выпуститьPaintRoom(Colors.White, Textures.Matt)
, и она будет хорошо скомпилирована, но в итоге мы получим комнату, окрашенную красным глянцем (0, 2) вместо матового белого (2, 0), который мы намеревались, и код на быстрый взгляд, кажется, говорит.
Так что строго типизированные перечисления в основном полезны, чтобы не допустить случайного помещения людей в места, для которых они не предназначены.И когда кто-то действительно хочет, чтобы его перечисление было int
, C # заставляет кодера прояснить свое намерение, настаивая на явном преобразовании.