为什么我们不能有“char”枚举types
我想知道为什么我们不能有“字符”作为基础枚举types。 因为我们有byte,sbyte,int,uint,long,ulong,short,ushort作为基础枚举types。 第二什么是一个枚举的默认基础types?
默认的types是int。 MSDN上的C# 参考的更多信息。 您还可以在MSDN上find指向C#语言规范的链接。 我想这个限制的原因可能来自语言规范4.1.5节中的这些陈述。
chartypes被归类为一个整型,但是它有两种不同于其他整型的方法:
•没有从其他types到chartypes的隐式转换。 特别是,即使sbyte,byte和ushorttypes的值的范围可以使用chartypes完全表示,但是从sbyte,byte或ushort到char的隐式转换不存在。
•字符types的常量必须写成字符文字或整数文字结合使用强制types转换为char。 例如,(char)10与'\ x000A'相同。
我知道这是一个较老的问题,但这些信息对我有帮助:
它似乎没有问题使用char作为C#.NET 4.0中枚举的值types(可能甚至3.5,但我没有testing过)。 以下是我所做的,完全有效:
public enum PayCode { NotPaid = 'N', Paid = 'P' }
将Enum转换为char:
PayCode enumPC = PayCode.NotPaid; char charPC = (char)enumPC; // charPC == 'N'
将char转换为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 }
像魅力一样工作,就像您期望的字符types一样!
这是我正在使用的解决方法
enum MyEnum { AA = 'A', BB = 'B', CC = 'C' }; static void Main(string[] args) { MyEnum e = MyEnum.AA; char value = (char)e.GetHashCode(); //value = 'A' }
从技术上讲,你不能这样做。 但是,您可以将枚举转换为一个字节,然后将其转换为字符。 如果你的目标是有这样的事情(这实现了这是不可能的:
public enum CharEnum { one = '1' }
但是,您可以使用ASCII字节值然后转换:
public enum CharEnum { one = 49, two = 50 }
然后你可以转换为字节和char来获取char值。 这不是真的漂亮,但它会工作,如果得到一个字符是你的最终目标。 如果您需要ASCII范围之外的字符,也可以使用unicode和一个int值。 🙂
char charPC = 'P'; if (Enum.IsDefined(typeof(PayCode), (PayCode)charPC)) { // check if charPC is a valid value PayCode enumPC = (PayCode)charPC; // enumPC == PayCode.Paid }
- 做了一个小小的改动,不需要把它转换成( int ),如果在所有的情况下,取决于枚举types。 但是,如果直接将其转换为枚举types本身,它应该始终工作。
几乎所有的事情都已经说过了。 只是想说你可以使用扩展,如果你使用了很多“字符枚举”:
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()); } }
字符枚举将简单地是string不是吗? 我不确定你会从字符枚举中得到什么其他好处?
正如其他人所说,枚举的默认types是int。