2009-02-21 16 views

Odpowiedz

15

Domyślnym typem jest int. Więcej informacji pod adresem C# reference na stronie MSDN. Możesz również znaleźć link do C# language specification na MSDN. Myślę, że przyczyna tego ograniczenia wynika prawdopodobnie z tych stwierdzeń w specyfikacji językowej, rozdział 4.1.5.

typ char jest klasyfikowany jako integralną typu, ale różni się od innych integralnych typach na dwa sposoby:

• Brak konwersje niejawne z innymi rodzajami do typu char. W szczególności, choć sbyte, bajt i ushort typów mają zakresy wartości, które są w pełni przedstawialnym użyciu typu char, ukryte konwersje z sbyte, bajtów lub ushort char nie istnieje.

• Stałe typu char należy napisany jako literałów znakowych lub jako całkowitymi-literały w połączeniu z oddanych do typu char. Na przykład (char) 10 jest taki sam jak "\ x000A".

-4

Wypisywanie znaków byłoby po prostu strunami, czyż nie? Nie jestem pewien, jakie inne korzyści można uzyskać z wyliczenia znaków?

Jak powiedzieli inni, domyślnym typem jest int dla wyliczenia.

+2

Jest to przydatne podczas konwersji z kolumny bazy danych, która jest NCHAR (0001) i wyliczenia. W szczególności przydatne jest posiadanie czegoś, co ma sens, gdy patrzy się na niego w selekcji, ale ogranicza się do określonego zestawu wartości. Jako przykład: Status. Oczekujące: "P", w toku: "I", zakończone pomyślnie: "S", nie powiodło się: "F". –

+0

Po drugie, komentarz do bazy danych, ponieważ właśnie to doprowadziło mnie do tego pytania. – Nathan

3

Technicznie nie można tego zrobić. Ale możesz zamienić enum na bajt, a następnie przekonwertować go na char. Jest to przydatne, jeśli twoim celem jest mieć coś takiego (zdając sobie sprawę, że jest to niemożliwe do zrobienia:

public enum CharEnum 
{ 
    one = '1' 
} 

Można to zrobić, jednak przy użyciu wartości ASCII bajtów, a następnie przekształcenie:

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

Możesz następnie przekonwertować na bajt i na char, aby uzyskać wartość char .Nie jest to naprawdę ładne, ale zadziała, jeśli zdobycie char jest twoim ostatecznym celem.Możesz również użyć unicode i wartość int, jeśli potrzebujesz znaków poza zakresu ASCII. :-)

13

To obejście używam

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

static void Main(string[] args) 
{ 
    MyEnum e = MyEnum.AA; 
    char value = (char)e.GetHashCode(); //value = 'A' 
} 
+5

Albo możesz po prostu napisać '(char) e' bez' GetHashCode() '. –

+4

Wszystko czego potrzebujesz to '(char) e'. [Ponosisz karę boksową, przechodząc do 'enum.GetHashCode'.] (Http://stackoverflow.com/questions/7995606/boxing-occurrence-in-c-sharp) – nawfal

76

wiem, że to starsza pytanie, ale ta informacja byłaby pomocna do mnie:

Wydaje się, że nie ma problemu przy użyciu char jako typ wartości dla teksty stałe w C# .NET 4.0 (być może nawet 3,5, ale tego nie testowałem).Oto co zrobiłem, i to całkowicie działa:

public enum PayCode { 
    NotPaid = 'N', 
    Paid = 'P' 
} 

Konwersja Enum char:

PayCode enumPC = PayCode.NotPaid; 
char charPC = (char)enumPC; // charPC == 'N' 

Konwersja char do ENUM:

char charPC = 'P'; 
if (Enum.IsDefined(typeof(PayCode), (int)charPC)) { // check if charPC is a valid value 
    PayCode enumPC = (PayCode)charPC; // enumPC == PayCode.Paid 
} 

działa jak czar, tak jak można oczekiwać od typu char!

+8

przegłosował twoją odpowiedź, ale bądź świadom enum w odpowiedzi nadal ma 'int' jako typ podstawowy. Kompilator traktuje to jako 'int'. Żałuję, że C# nie miał tego przypadku krawędzi. – nawfal

-1

Prawie wszystko zostało już powiedziane na ten temat. Chciałem tylko powiedzieć, można użyć rozszerzenia jeśli wiele „teksty stałe char” Przeznaczenie:

public enum MyEnum 
{ 
    MY_VALUE = 'm' 
} 

public static class MyExtensions 
{ 
    public static char GetChar(this Enum value) 
    { 
     return (char)value.GetHashCode(); 
    } 
} 

class Program 
{ 
    public static void Main(string[] args) 
    { 
     MyEnum me = MyEnum.MY_VALUE; 
     Console.WriteLine(me + " = " + me.GetChar()); 
    } 
} 
+1

Wszystko czego potrzebujesz to '(char) e'. [Otrzymujesz karę boksowania, przechodząc do 'enum.GetHashCode'.] (Http://stackoverflow.com/questions/7995606/boxing-occurrence-in-c-sharp) Co więcej,' GetHashCode' jest jedynie szczegółem implementacji . – nawfal

0
char charPC = 'P'; 
if (Enum.IsDefined(typeof(PayCode), (PayCode)charPC)) { 
     // check if charPC is a valid value 
     PayCode enumPC = (PayCode)charPC; // enumPC == PayCode.Paid 
} 
  • Wykonane małą zmianę, nie ma potrzeby, aby przekształcić go do (int) w jeśli dla wszystkich przypadków, zależy od typu wyliczenia. Ale jeśli rzucisz go bezpośrednio na sam typ enum, to zawsze powinno działać.
Powiązane problemy