Не могли бы вы попробовать следующее.
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.
Тип по умолчанию является интервалом. Больше информации в ссылке C# в MSDN. Можно также найти ссылку на спецификация языка C# в MSDN. Я думаю, что причина ограничения, вероятно, происходит из этих операторов в спецификации языка, разделите 4.1.5.
символьный тип классифицирован как целочисленный тип, но он отличается от других целочисленных типов двумя способами:
• Там не являются никакими неявными преобразованиями от других типов до символьного типа. В частности, даже при том, что sbyte, байт и типы ushort имеют диапазоны значений, которые являются полностью представимым использованием символьного типа, неявных преобразований из sbyte, байта, или ushort для обугливания не существуют.
• Константы символьного типа должны быть записаны как символьные литералы или как целочисленные литералы в сочетании с броском для ввода символа. Например, (символ) 10 совпадает с '\x000A'.
Технически, Вы не можете сделать этого. Но, можно преобразовать перечисление в байт и затем преобразовать это для обугливания. Это полезно, если Ваша цель состоит в том, чтобы иметь что-то вроде этого (понимание, что это невозможно сделать:
public enum CharEnum
{
one = '1'
}
можно сделать это, однако, при помощи значений байта ASCII и затем преобразования:
public enum CharEnum
{
one = 49,
two = 50
}
можно затем преобразовать в байт и обугливаться для получения символьного значения. Это не действительно симпатично, но это будет работать, если получение символа будет Вашей конечной целью. Можно также использовать unicode и международное значение при необходимости в символах за пределами диапазона ASCII. :-)
Символьные перечисления просто были бы строками, не будет они? Я не уверен, что другое преимущество Вы получили бы из символьного перечисления?
, Поскольку другие сказали, тип по умолчанию является интервалом для перечисления.
Будучи нацелен на 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
}
Это обходной путь, который я использую
enum MyEnum
{
AA = 'A',
BB = 'B',
CC = 'C'
};
static void Main(string[] args)
{
MyEnum e = MyEnum.AA;
char value = (char)e.GetHashCode(); //value = 'A'
}