.NET Enum базовый тип Char - PullRequest
       22

.NET Enum базовый тип Char

9 голосов
/ 05 августа 2011

Согласно msdn Перечисления не могут иметь базовый тип char.Почему у перечислений нет базового типа char?Кроме того, почему Microsoft настоятельно рекомендует, чтобы перечисление содержало константу со значением 0?Большое спасибо

Ответы [ 4 ]

5 голосов
/ 05 августа 2011

Вы можете найти ссылку на спецификацию языка C # .Я думаю, что причина ограничения, вероятно, вытекает из этих утверждений в спецификации языка, раздел 4.1.5.

Тип char классифицируется как целочисленный тип, но он отличается от других целочисленных типов двумя способами:

  • Не существует явных преобразований других типов в тип char.В частности, несмотря на то, что типы sbyte, byte и ushort имеют диапазоны значений, которые полностью представимы с использованием типа char, неявные преобразования из sbyte, byte или ushort в char не существуют.

  • Константы типа char должны быть записаны как символьные литералы или как целочисленные литералы в сочетании с приведением к типу char.Например, (char) 10 совпадает с '\ x000A'.

Что касается нуля, потому что значение по умолчанию для неинициализированного enum равно 0.

3 голосов
/ 05 августа 2011

Хотя, как вы видели здесь, вам определенно не разрешается определять перечисление символов, потому что не существует неявного преобразования из char в любой другой целочисленный тип, но существует целочисленное преобразование из char в целое число , так что вы можете сделать это:

public enum MyCharEnum
{
    BEL = 0x07,
    CR = 0x0D,
    A = 'A',
    z = 'z'
}

И использовать явное преобразование в char, таким образом:

MyCharEnum thing = MyCharEnum.BEL;
char ch = (char)thing;
System.Console.WriteLine(ch.ToString());

(и, да, он издает звуковой сигнал - как в старые добрые времена!)

2 голосов
/ 05 августа 2011

Почему перечисления не могут иметь базовый тип char?

Потому что это на самом деле не имеет смысла (во многом так же, как не имеет смысла иметь базовый тип с плавающей точкой).Под прикрытием перечисление является целым числом, однако, поскольку символ может быть любым символом Юникода, на самом деле не существует сопоставимого преобразования символов в целые числа.

Почему Microsoft настоятельно рекомендует, чтобы перечисление содержалоконстанта со значением 0?

Поскольку значение по умолчанию для неинициализированного перечисления равно нулю (см. Перечисления должны иметь нулевое значение )

0 голосов
/ 05 августа 2011

Почему у перечислений нет базового типа char?

Я бы предположил, что это связано с тем, что .NET обрабатывает символы как Unicode, что означает, что байт Char! = (Его значение может быть больше 255). Enum также не может быть основан на булевом типе, и это также целочисленный тип. Также использование Char в качестве базового типа будет дублировать существующий базовый тип, так что в этом нет никакого смысла.

Почему Microsoft настоятельно рекомендует, чтобы перечисление содержало константу со значением 0?

Причина, по которой вам всегда рекомендуется иметь значение, равное 0, заключается в том, что перечисление является типом значения, а при создании нового оно будет иметь значение 0.

...