Chcę wiedzieć, dlaczego nie możemy mieć "char" jako podstawowego typu enum. Ponieważ mamy bajt, sbyte, int, uint, long, ulong, short, ushort jako podstawowy typ enum. Po drugie, jaki jest domyślny podstawowy rodzaj wyliczenia?Dlaczego nie możemy mieć typów "char" enum
Odpowiedz
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".
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.
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. :-)
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'
}
Albo możesz po prostu napisać '(char) e' bez' GetHashCode() '. –
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
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!
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
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());
}
}
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
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ć.
- 1. Dlaczego możemy mieć statyczne końcowe elementy, ale nie możemy mieć statycznej metody w wewnętrznej klasie?
- 2. Bind char do typu enum
- 3. Nazwy typów enum
- 4. Dlaczego możemy przypisać char do int w java?
- 5. Dlaczego char [] i char * są różne, ale czasami ... nie?
- 6. Dlaczego nie możemy wykonać pętli `...?
- 7. Dziwne zachowanie zerowych typów Enum
- 8. destruktory z wbudowanych typów (int, char itp ..)
- 9. Dlaczego nie możemy trywialnie skopiować std :: function
- 10. Porównywanie dwóch typów enum * dla równoważności?
- 11. Czy możemy mieć zestaw niestandardowych modułów?
- 12. Czy możemy mieć tekst nieedytowalny w edittext
- 13. ISO C++ zabrania odwołania przesyłają typów 'enum'
- 14. Tworzenie ENUM i typów w SQLite
- 15. Jeśli operator <działa poprawnie dla typów zmiennoprzecinkowych, dlaczego nie możemy go użyć do testowania równości?
- 16. Dlaczego potrzebujemy "algebraicznych typów danych"?
- 17. Char Array - dlaczego pętla nie jest nieskończona?
- 18. Dlaczego funkcja Convert.ToDouble (char) nie jest obsługiwana?
- 19. Jak mogę używać typów enum w XAML?
- 20. Java: Dlaczego mogę mieć odniesienie do niezerowej tablicy konkretnych sparametryzowanych typów?
- 21. Dlaczego FacesServlet nie może mieć wzorca url/*.?
- 22. dlaczego interfejs nie może mieć statyczną metodą członek
- 23. Dlaczego ten kod nie narusza "wymagań dotyczących nasycenia rodzin typów"?
- 24. Dlaczego kompilator nie może mieć konfliktu "shift/shift"?
- 25. Dlaczego DuplicateRecordFields nie może mieć wnioskowania o typie?
- 26. Dlaczego kolekcje Java nie mogą bezpośrednio zapisywać typów pierwotnych?
- 27. ma int mieć operatora ==
- 28. Kolekcje Java. Dlaczego nie ma typów pierwotnych?
- 29. Dlaczego nie ma typeklasy dla typów kontenerów?
- 30. Dlaczego tutaj nie jest pisana inferencja typów?
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". –
Po drugie, komentarz do bazy danych, ponieważ właśnie to doprowadziło mnie do tego pytania. – Nathan