Здесь задан ряд вопросов.
Почему я не могу объявить перечисление, наследуемое от байта, но я могу от байта?
Как уже отмечали другие, именно об этом говорится в спецификации.
Примечания комитета по проектированию языков не оправдывают это решение. В записках за июнь 2000 года написано
Ключевые слова для предопределенных типов (например, int) и их соответствующие имена типов (например, Int32) в большинстве случаев могут, но не полностью, использоваться взаимозаменяемо. Мы обсудили, хотим ли мы внести какие-либо изменения в эту область. Мы не сделали.
Вот список мест, где они не являются взаимозаменяемыми.
- "int" может использоваться как базовый тип для перечислений; Int32 не может.
- Объявления псевдонимов не могут использовать ключевые слова.
Некоторые мои размышления на эту тему:
Первое, что приходит на ум, это то, что каждый раз, когда вы предоставляете пользователю выбор, вы даете ему возможность написать ошибку, и каждый раз, когда вы даете ему возможность написать ошибку, вы должны сделать сообщение об ошибке. для этого. Если мы разрешили «enum X: Byte», то мы дали бы разумное сообщение об ошибке, когда пользователь случайно удалил «using System;». Мы можем избежать этой потенциальной путаницы и всех затрат на разработку и тестирование эвристики сообщения об ошибках, просто не допуская выбора в первую очередь.
Второе, что приходит на ум, заключается в том, что базовый тип перечисления в основном относится к механизму перечисления, а не к его значению . Поэтому представляется вероятным, что базовое предложение типа должно быть ограничено вещами, которые не требуют семантического анализа; мы знаем, что базовый тип является одним из восьми возможных типов, поэтому давайте просто сделаем так, чтобы пользователь механически однозначно выбрал один из этих восьми типов.
Третье, что приходит на ум, - это то, что анализ ошибок может выполняться во время синтаксического анализа, а не семантического анализа. Чем раньше обнаружена ошибка, тем лучше.
ОБНОВЛЕНИЕ: Я только что спросил одного из людей, которые были в комнате в тот день, было ли что-то, что я пропустил в своих размышлениях, и он сказал, что да, они подумали об этом и решили, что проведение полного анализа типа работы для команда разработки, тестирования и сопровождения, работа, которая не принесла пользователю никакой ценности. (Он также отметил, что у них были аналогичные аргументы по сравнению с System.Void; должно ли быть законным, например, сказать «public static System.Void Main (string [] args)»? Опять они решили, что это не добавило ценности пользователям, но сделали добавить потенциальную двусмысленность и работу для команды.)
Почему "char" не является допустимым базовым типом?
Опять же, это то, что сказано в спецификации. Опять же, заметки о дизайне языка за октябрь 1999 года не помогают определить, почему:
Целочисленные типы без знака могут использоваться в качестве базовых типов для перечислений. Единственный целочисленный тип, который нельзя использовать, это char.
Опять же, мы можем догадаться. Я думаю, что перечисления предназначены для фантазии чисел. Символы на практике являются целыми числами в качестве детали реализации, но логически они не являются числами , они являются символами . Мы хотим иметь возможность выполнять операции над перечислениями, такие как флаги сложения, «или» и «и» и т. Д .; В спецификации ясно, что эти операции выполняются так, как если бы они выполнялись для базового типа. Тип char, не являющийся логически числом, определяет не все операторы, которые вам могут понадобиться. И, наконец, если вам нужно двухбайтовое значение перечисления, у вас уже есть short и ushort.
Связанный вопрос из электронного письма по этому вопросу:
Внимательное прочтение спецификации грамматики говорит о том, что «char» является грамматически допустимым базовым типом, но параграф пояснительного текста после грамматики говорит, что «char» не является допустимым базовым типом. Спецификация несовместима?
Да. Я не теряю сон из-за этого. Если вам от этого легче, представьте себе грамматическую линию, которая гласит
enum-base : целочисленного типа
вместо этого читает
enum-base : целочисленного типа (но не char
)