




Да, они.
Следующее взято из http://www.csharp-station.com/Tutorials/Lesson17.aspx
Перечисления - это строго типизированные константы. По сути, это уникальные типы, которые позволяют присваивать символьные имена целым значениям. В традиции C# они строго типизированы, что означает, что перечисление одного типа не может быть неявно присвоено перечислению другого типа, даже если базовое значение их членов одинаково. Точно так же интегральные типы и перечисления не являются взаимозаменяемыми неявно. Все присвоения между различными перечисляемыми типами и целочисленными типами требуют явного приведения.
да.
C#: типы перечислений:
-Безопасное перечисление именованных значений.
-Предотвращает ошибки программирования
-Пользователь может контролировать базовый тип (по умолчанию int)
-Также может контролировать базовые значения
Технически нет, потому что вы можете представить Enum как его базовое значение (int, long и т. д.). Однако, если вы убедитесь, что используете перечисление только по предоставленным им именам, вы получите ошибки времени компиляции, если измените имя перечислимого значения без обновления его ссылок. В этом отношении да, это тип безопасный.
Чтобы дать немного другой ответ ... хотя значения являются типобезопасными с точки зрения литья, они все еще не отмечены после того, как они были преобразованы, т.е.
enum Foo { A = 1, B = 2, C = 3 }
static void Main()
{
Foo foo = (Foo)500; // works fine
Console.WriteLine(foo); // also fine - shows 500
}
По этой причине вам следует позаботиться о проверке значений - например, с default в switch, который вызывает исключение.
Вы также можете проверить (для значений, отличных от [Flags]) через:
bool isValid = Enum.IsDefined(typeof(Foo), foo);
О, это хороший совет. Я этого не знал ... всегда предполагал, что это вызовет исключение InvalidCastException или что-то в этом роде. Однозначно +1 от меня!
Должно быть -1 для Enum.IsDefined ... см. Мой ответ здесь: stackoverflow.com/questions/208404/are-c-enums-typesafe#2090 21
Я опаздываю на вечеринку, но я хотел выкинуть кое-что лишнее ... Обновление Рекомендации по проектированию .NET Framework от Krzysztof Cwalina. В дополнение к приведенному выше отличному совету по проверке, чтобы гарантировать, что допустимое значение передается в ваши Enums, это дает другие рекомендации и советы о том, как их эффективно использовать, множество ошибок (особенно связанных с перечислениями Flags) и т. д.
Но разве это ответ на вопрос?
Для тех, кто предлагает использовать Enum.IsDefined для проверки аргументов ... не делайте этого! Пер Брэд Абрамс (из Обновление рекомендаций по дизайну фреймворка в Enum Design):
There are really two problems with Enum.IsDefined(). First it loads reflection and a bunch of cold type metadata making it a deceptively expensive call. Secondly, as the note alludes to there is a versioning issue here.
Хороший звонок; Я пропустил всю эту заметку при первом чтении сегодня.
@ Джон Руди: Спасибо! Я уже знал об этих проблемах, но хорошо иметь возможность указать на некоторую документацию по этому поводу, особенно на примере.
да, они строго типизированы, безопасны и не могут не препятствовать преобразованию постоянных переменных перечисления в целочисленное значение u hv 2 явно сделать dat например enum days { солнце, пн } int e = (int) days.sun; console.writeline (e);
Перечисления C# являются типобезопасным значением
Я наткнулся на отличный видеоурок по перечислениям, объясняющий их типобезопасный характер. Посмотрите здесь и там.
ссылка прогнила