Почему у нас не может быть “символьных” перечислимых типов

Не могли бы вы попробовать следующее.

echo "my name is user from here not there." |
awk '{for(i=1;i<=NF;i++)
    if(length($i)>3){$i=toupper(substr($i,1,1)) substr($i,2)}}
    1'

Результат:

my Name is User From Here not There.
41
задан Guillermo Gutiérrez 8 January 2014 в 17:27
поделиться

5 ответов

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

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

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

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

15
ответ дан tvanfosson 27 November 2019 в 00:19
поделиться

Технически, Вы не можете сделать этого. Но, можно преобразовать перечисление в байт и затем преобразовать это для обугливания. Это полезно, если Ваша цель состоит в том, чтобы иметь что-то вроде этого (понимание, что это невозможно сделать:

public enum CharEnum
{
    one = '1'
}

можно сделать это, однако, при помощи значений байта ASCII и затем преобразования:

public enum CharEnum
{
    one = 49,
    two = 50
}

можно затем преобразовать в байт и обугливаться для получения символьного значения. Это не действительно симпатично, но это будет работать, если получение символа будет Вашей конечной целью. Можно также использовать unicode и международное значение при необходимости в символах за пределами диапазона ASCII. :-)

3
ответ дан Jason Plank 27 November 2019 в 00:19
поделиться

Символьные перечисления просто были бы строками, не будет они? Я не уверен, что другое преимущество Вы получили бы из символьного перечисления?

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

-4
ответ дан Jeffrey Cameron 27 November 2019 в 00:19
поделиться

Будучи нацелен на VB.NET и потребителей CLI, можно скомпилировать символьное перечисление как это (самый легкий с VB.NET или проектом C#, который имеет Поддержку IL (расширение) включил):

.class public auto ansi sealed Hafner.Testing.EdgeCase.CharEnum
       extends [mscorlib]System.Enum
{
    .field public specialname rtspecialname char value__
    .field public static literal valuetype Hafner.Testing.EdgeCase.CharEnum Min = char(0)
    .field public static literal valuetype Hafner.Testing.EdgeCase.CharEnum Zero = char(0)
    .field public static literal valuetype Hafner.Testing.EdgeCase.CharEnum Max = char(65535)
    .field public static literal valuetype Hafner.Testing.EdgeCase.CharEnum DuplicateSameValue = char(65) //A
    .field public static literal valuetype Hafner.Testing.EdgeCase.CharEnum duplicateSameValue = char(65) //A
    .field public static literal valuetype Hafner.Testing.EdgeCase.CharEnum DuplicateOtherValue = char(90) //Z
    .field public static literal valuetype Hafner.Testing.EdgeCase.CharEnum duplicateOtherValue = char(88) //X

}
0
ответ дан 27 November 2019 в 00:19
поделиться

Это обходной путь, который я использую

enum MyEnum
{
    AA = 'A',
    BB = 'B',
    CC = 'C'
};

static void Main(string[] args)
{
    MyEnum e = MyEnum.AA;
    char value = (char)e.GetHashCode(); //value = 'A'
}
13
ответ дан 27 November 2019 в 00:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: